提问者:小点点

具有Oauth 2.0 / OpenID Connect和内部身份验证的Spring boot API?


我很难找到一个很好的方法来实现Oauth 2.0和OpenID Connect身份验证,同时使用Spring Security为B2BWeb应用程序的API实现现有的内部电子邮件密码身份验证。

我们有一个后端REST API,它是一个Spring Boot servlet应用程序,目前使用OAuth 1.0和密码授权对用户进行身份验证。前端是一个Angular单页应用程序,用户必须使用其用户名和密码登录。API的/oauth/Tokendpoint然后提供一个不透明的访问令牌,用于获取安全资源,然后显示在应用程序中。

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

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

我读过很多关于不使用OAuth进行第一方登录的文章,因为它的主要用途是外部认证,但同样,这并不适用,因为我们也需要第三方认证。

如果不再支持<code>密码</code>授权类型,那么实现一个Spring Boot授权服务器的安全方法是什么?

我考虑了实现一个初步步骤,即向<code>/loginendpoint发出带有基本身份验证的POST请求,该endpoint仅返回200 HTTP状态,然后继续执行<code>/oauth2/authorize请求,该请求将立即传递授权代码,而无需重定向,因为我的会话已通过身份验证。

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


共1个答案

匿名用户

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

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

例如,Keycloak就是这样做的。

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

  • 访问令牌:放入对安全资源服务器的请求的Authorization标头(可以是JWT或不透明字符串,无所谓,客户端不应尝试从访问令牌中提取数据)
  • 刷新令牌:在访问令牌过期之前发送到授权服务器以续订访问令牌
  • id token:获取用户配置文件数据(电子邮件、用户名、配置文件图片等)

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

从资源服务器的角度来看,访问令牌是设置安全上下文的来源,无论是通过在本地解码和验证 JWT,还是在授权服务器上使用令牌自检。

看看这些资源服务器配置的教程。