Rest,Spring 拥有 OAuth2 服务器 + OAuth2 提供商,如 Facebook、Google、Yahoo
Posted
技术标签:
【中文标题】Rest,Spring 拥有 OAuth2 服务器 + OAuth2 提供商,如 Facebook、Google、Yahoo【英文标题】:Rest, Spring own OAuth2 server + OAuth2 providers like Facebook, Google, Yahoo 【发布时间】:2015-06-15 08:38:50 【问题描述】:在 Spring Boot 应用程序中,我使用 Spring Security 和 Spring OAuth2 保护了我的 Spring MVC REST 端点。我有自己的授权\资源服务器,因此为了与我们的 API 通信,客户端(AngularJS)需要从我的 API 授权服务器获取 accessToken。
一切正常,但对于我的 API 的身份验证/授权,用户需要创建他的帐户并向我们提供他的用户名/密码。
我想简化此过程,并建议用户通过 Google/Facebook/Twitter oAuth 提供商在我的 API 上进行身份验证。
现在我还不清楚它必须如何工作。例如,我的一个想法 - Facebook 将发布自己的 accessToken 并将其传递回我的 API。基于此 accessToken 我的 API 将发出自己的 accessToken 并将其传递回客户端应用程序(AngularJS)。或者我应该将 Facebook accessToken 直接传递给客户端应用程序吗?
所描述案例的正确架构是什么?它应该如何工作?
也许有一些例子可以演示这种基于 Spring 框架的架构?
【问题讨论】:
【参考方案1】:如果是自己的 OAuth2 或 OAuth2 + JWT 令牌,请查看以下问题 Integrate Spring Security OAuth2 and Spring Social 特别是 @rarriuso 提供的答案。您必须提供自己的SocialAuthenticationSuccessHandler
并在通过任何 3rdparty OAuth2 提供商成功授权后使用自己的 oauth2Token 发送重定向。
换句话说,这种与技术无关的解决方案的主要思想是颁发您自己的访问令牌,并在用户成功通过 3rdparty OAuth2 提供程序进行身份验证后将其提供给用户。
【讨论】:
【参考方案2】:如果您想将身份验证委托给外部提供者,您可以使用OAuth2ClientAuthenticationProcessingFilter
,或Spring Cloud Security 中提供的便利注释和外部配置。示例(来自 Spring Cloud Security 主页):
应用程序.java:
@SpringBootApplication
@EnableOAuth2Sso
public class Application
...
application.yml:
spring:
oauth2:
client:
clientId: bd1c0a783ccdd1c9b9e4
clientSecret: 1a9030fbca47a5b2c28e92f19050bb77824b5ad1
accessTokenUri: https://github.com/login/oauth/access_token
userAuthorizationUri: https://github.com/login/oauth/authorize
clientAuthenticationScheme: form
resource:
userInfoUri: https://api.github.com/user
preferTokenInfo: false
如果您的应用程序在端口 8080 上运行(我相信),这适用于 github。类似的配置适用于 facebook、cloud foundry、google 和其他 OAuth2 提供商。
【讨论】:
感谢您的回答。看起来棒极了,我今天将在我的家用机器上尝试这个解决方案!一个问题 - 它会与我自己通过 Spring OAuth 实现的 OAuth2 AuthServer 一起工作吗? 谢谢,我的意思是我已经在这个应用程序中拥有了自己的 OAuth2 服务器(这个 OAuth2 服务器是这个应用程序的一部分)。除了这种身份验证方法之外,我还想添加外部 oauth2 提供程序。那么,在这种情况下它会起作用吗? 主要问题是我自己的 OAuth2 服务器如何使用这些身份验证。现在他通过调用 SecurityContextHolder.clearContext(); 拒绝 OAuth2AuthenticationProcessingFilter.doFilter 方法中的 SocialAuthenticationToken;我想我需要找到一种方法来手动创建 OAuth2Authentication 并将其放入安全上下文 SignInAdapter.signIn 方法中,以便通过我自己的 OAuth2 服务器通过验证.. 很奇怪!过去几周我一直在谷歌搜索,似乎互联网上没有人能够做到这一点!我搜索了几乎所有其他平台 rails、play、asp.net 都没有运气:( 嗨@maret,如果有自己的OAuth2 或OAuth2 + JWT 令牌,请查看以下问题***.com/questions/32313821/… 特别是rbarruso 提供的答案。您必须提供自己的 SocialAuthenticationSuccessHandler 并在与任何 3rdparty OAuth2 提供商成功授权后使用自己的 oauth2Token 发送重定向。我希望这会对你有所帮助。以上是关于Rest,Spring 拥有 OAuth2 服务器 + OAuth2 提供商,如 Facebook、Google、Yahoo的主要内容,如果未能解决你的问题,请参考以下文章
带有 spring-security 的 OAuth2 - 通过 HTTP 方法限制 REST 访问
Spring Boot(OAuth2 和 REST):BeanCreationError
使用 Spring Security 为 Web 客户端授予针对 REST 服务器的 Oauth2 密码
Spring Security OAuth2 在 REST 服务上被拒绝访问
spring-security oauth2 REST 服务器在错误凭据(400)错误响应中不需要的 Stacktrace