【问题标题】:Rest, Spring own OAuth2 server + OAuth2 providers like Facebook, Google, YahooRest,Spring 拥有 OAuth2 服务器 + OAuth2 提供商,如 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 框架的架构?

【问题讨论】:

    标签: spring spring-security oauth-2.0 spring-social spring-security-oauth2


    【解决方案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 都没有运气:(
      • 嗨@mar​​et,如果有自己的OAuth2 或OAuth2 + JWT 令牌,请查看以下问题stackoverflow.com/questions/32313821/… 特别是rbarruso 提供的答案。您必须提供自己的 SocialAuthenticationSuccessHandler 并在与任何 3rdparty OAuth2 提供商成功授权后使用自己的 oauth2Token 发送重定向。我希望这会对你有所帮助。
      猜你喜欢
      • 2015-06-26
      • 2014-11-18
      • 2013-10-18
      • 2015-03-31
      • 1970-01-01
      • 1970-01-01
      • 2019-05-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多