我使用的是Sping Boot 3和Spring Security 6。
我的目标是实现一个使用JWT令牌的登录功能。登录页面应该有两个选项:
- 自定义登录/注册表单
- 使用Google登录(OAuth2登录)
自定义鉴权流程如下: - 用户通过登录页面输入其用户名和密码。
- 从数据库中获取用户名并检查密码是否匹配。
- 然后生成一个JWT令牌并在响应中返回。
- 客户端应用程序将此JWT令牌用于后续请求。
我想使用Google Flow登录应该包括以下步骤:
当我在用户授予访问权限后从Google的重定向接收到授权代码时,我将继续执行以下步骤。
- 将授权代码交换为访问令牌并对其进行验证。
- 从Google获取用户信息。
- 从数据库创建或获取用户。
- 生成与自定义身份验证流中相同类型的JWT令牌。
- 将JWT令牌添加到响应并将其重定向到我的UI应用程序。
- 然后UI应用程序使用提供的JWT令牌处理后续请求。
在分析了Spring Security的默认功能之后,我看到OAuth2LoginAuthenticationFilter
负责在授权服务器使用代码重定向之后进行身份验证。
似乎此过滤器大致执行以下步骤:
- 从会话中获取原始身份验证请求。
- 执行代码/令牌交换。
- 验证令牌。
- 从Google获取用户信息。
- 验证用户。
因此,我知道我需要创建这个过滤器的自定义版本,并实现我为用例设计的步骤。
然而,我看到Spring Security不允许为OAuth2登录设置自定义过滤器。它与OAuth2LoginAuthenticationFilter
紧密耦合。请在此处查看OAuth2 LoginConfigurer类定义。public final class OAuth2LoginConfigurer<B extends HttpSecurityBuilder<B>> extends AbstractAuthenticationFilterConfigurer<B, OAuth2LoginConfigurer<B>, OAuth2LoginAuthenticationFilter> {
您对如何正确实现此功能有什么想法吗?
如果你觉得我的流程不对,我也愿意接受其他的解决方案。
1条答案
按热度按时间anauzrmj1#
在OAuth2中,登录(授权代码流)由客户端发起,重定向到授权服务器。
登录步骤(用户名/密码表单,MFA,使用Google登录等)是授权服务器业务。您在Spring Security OAuth2客户端API中探索的内容在用户在授权服务器上进行身份验证后调用。
因此,您需要的是一个带有“登录Google”的授权服务器。您可以使用Spring编写自己的授权服务器项目,从“货架”中选择一个,如Keycloak,或者在许多云产品中选择(Auth 0,Amazon Cognito,Azure AD等......)。几乎所有都具有社交登录功能。