Spring Boot OAuth2 - 使用本地用户数据库向 Facebook 进行身份验证
Posted
技术标签:
【中文标题】Spring Boot OAuth2 - 使用本地用户数据库向 Facebook 进行身份验证【英文标题】:Spring Boot OAuth2 - authenticate with Facebook using local user database 【发布时间】:2016-08-20 11:48:42 【问题描述】:我正在使用 Spring Boot、Spring MVC 和 spring-security-oauth2 创建网站,并且正在尝试针对 Google、Facebook、GitHub ... OAuth2 服务对本地存储的用户进行身份验证。我也有他们的标准用户名密码。
我的想法是从第一次成功的 oauth 登录将每个用户的 [OAuth2_provider_type,OAuth2_subjectId] 对存储到本地数据库,然后在用户再次通过 Google(或 FB ...)验证自己时使用这对找到正确的用户.我已经通过 Google/Facebook 正确地进行了身份验证,但我不知道如何将本地存储的用户连接到 Spring OAuth2 Security 并将他们带到 SecurityContext。
有人能指出我可以看到类似内容的示例或集成测试吗?
在这里我找到了很棒的教程 Spring Boot and OAuth2,在 如何添加本地用户数据库 部分有提示。尝试从 Google 重定向到 授权重定向 URI http://localhost:10001/user
端点,该端点定义为 .antMatchers("/user").authenticated()
并获得 Access Denied
o.s.s.w.a.i.FilterSecurityInterceptor - Secure object: FilterInvocation: URL: /user?state=Wj7RVk&code=4/wa2AFtJr0K3cKTxDAYo8rTOu2p41km5o3YCPnimx4wU; Attributes: [authenticated]
o.s.s.w.a.i.FilterSecurityInterceptor - Previously Authenticated: org.springframework.security.authentication.AnonymousAuthenticationToken@6fa8940c: Principal: anonymousUser; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@fffde5d4: RemoteIpAddress: 0:0:0:0:0:0:0:1; SessionId: 5888363FA9E329992073DCE4B21E8B5C; Granted Authorities: ROLE_ANONYMOUS
o.s.s.access.vote.AffirmativeBased - Voter: org.springframework.security.web.access.expression.WebExpressionVoter@29802df4, returned: -1
o.s.s.w.a.ExceptionTranslationFilter - Access is denied (user is anonymous); redirecting to authentication entry point
org.springframework.security.access.AccessDeniedException: Access is denied
非常感谢您的帮助!
【问题讨论】:
【参考方案1】:尝试从 Google 重定向到授权重定向 URI http://localhost:10001/user
o.s.s.w.a.i.FilterSecurityInterceptor - 安全对象: 过滤器调用: URL: /user?state=Wj7RVk&code=4/wa2AFtJr0K3cKTxDAYo8rTOu2p41km5o3YCPnimx4wU; 属性:[已认证]
看起来你做错了,你不应该用code
和state
参数去/user
!流程是:
-
您为类似的 url 注册了一个 sso 端点
localhost:8080/login/facebook
一旦您点击了一个链接,该链接指向您获得的端点
重定向到 facebook 授权页面
一旦获得授权,您应该被重定向回
localhost:8080/login/facebook
带有您的状态和代码参数:
localhost:8080/login/facebook?state=Wj7RVk&code=4/wa2AFtJr0K3cKTxDAYo8rTOu2p41km5o3YCPnimx4wU
当 sso 过滤器获取代码时,将再次转到 facebook 以
将 access_code 交换为 access_token 并将令牌放入会话中
在进程结束时调用AuthenticationSuccessHandler
进行重定向
你根据它的具体实现(通常是
SavedRequestAwareAuthenticationSuccessHandler
)
如果这些步骤成功完成,您可以转到/user
端点获取一些用户信息。
【讨论】:
以上是关于Spring Boot OAuth2 - 使用本地用户数据库向 Facebook 进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot OAuth2 - 使用本地用户数据库向 Facebook 进行身份验证
Spring Boot security/OAuth2 - 丢弃远程身份验证并在访问远程 userInfo 端点后恢复本地
Spring Boot + OAuth2 + Google Login - 如何实现注销
使用 spring-boot OAuth2 服务器保护的 Spring-boot 应用程序