繁体   English   中英

Spring 启动 API 与 Oauth 2.0/OpenID Connect 和内部身份验证?

[英]Spring boot API with both Oauth 2.0/OpenID Connect and internal authentication?

I'm having a hard time figuring a good way to implement Oauth 2.0 and OpenID Connect authentication alongside an existing internal email+password authentication for a B2B Web app's API using Spring security.

We have a backend REST API that is a Spring Boot servlet application which currently authenticates users with OAuth 1.0 and the password grant. 前端是一个 Angular 单页应用程序,用户必须使用其用户名和密码登录。 然后,API 的/oauth/token端点提供一个不透明的访问令牌,用于获取安全资源,然后显示在应用程序中。

我们想增加使用 OpenID 连接的外部身份验证登录的可能性,这是切换到 OAuth 2.0 和 JWT 令牌的绝佳机会。 然后,我们的 API 将接受它交付的 JWT 令牌以及由已接受的发行人发出的外部 JWT 令牌。 使用 Spring 安全性的 OAuth 资源服务器读取和验证 JWT 令牌不会有问题。 然而,如何使经典的用户名+密码登录流程与 JWT 令牌一起工作,事情变得复杂起来。

我们考虑过提供 JWT 访问令牌,就像我们过去使用旧的 OAuth 1.0 令牌一样。 问题是,较新的 OAuth 规范建议不要使用password授权,而且我们计划使用的 Spring 授权服务器项目根本不支持它。 对于这种情况,带有 PKCE 的授权代码流似乎太多了,因为我们不希望后端 API 呈现登录表单,而是使用作为单页应用程序一部分的现有登录表单中输入的凭据。

我已经阅读了很多关于不使用 OAuth 进行第一方登录的信息,因为它的主要用途是用于外部身份验证,但同样,这并不适用,因为我们还需要第 3 方身份验证。

什么是实现 Spring 引导授权服务器的安全方法,该服务器可以将 JWT 访问令牌传递给第一方客户端以换取用户的凭据,所有这些都使用现有的登录页面,并且不再支持password授予类型?

我考虑过实施一个初步步骤,即向/login端点发送带有基本身份验证的 POST 请求,该端点仅返回 200 HTTP 状态,然后继续执行/oauth2/authorize请求,该请求将立即提供授权代码而无需重定向,因为我的 session已通过身份验证。

如果需要,我很乐意提供更多详细信息。 这是我用于此项目的资源

设置一个能够进行身份联合的授权服务器怎么样?

在这种配置中,授权服务器负责提供身份、代理一个或多个来源(例如,您现有的用户数据库,可能还有 Google、Facebook、Github 等)

例如, Keycloak 就是这样做的。

从客户端的角度来看(您的 Angular 应用程序),授权服务器用于获取:

  • 访问令牌:对安全资源服务器的请求放入Authorization header(可以是 JWT 或不透明字符串,没关系,客户端不应尝试从访问令牌中提取数据)
  • refresh-token:在 access-token 过期之前发送到授权服务器以更新它
  • id-token:获取用户个人资料数据(电子邮件、用户名、个人资料图片等)

您应该查看https://github.com/damienbod/angular-auth-oidc-client以将 Angular 应用程序连接到 OIDC 授权服务器。

从资源服务器的角度来看,访问令牌是设置安全上下文的来源,通过在本地解码和验证 JWT 或在授权服务器上进行令牌自省。

查看有关此类资源服务器配置的那些教程

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM