Spring security 同时为多个社交网络启用OAuth2SSO

Spring security 同时为多个社交网络启用OAuth2SSO,spring-security,spring-boot,spring-security-oauth2,spring-social,spring-cloud,Spring Security,Spring Boot,Spring Security Oauth2,Spring Social,Spring Cloud,我正在实现一个SpringBoot应用程序,它需要提供OAuth2令牌授权并支持多种社会服务(google+、facebook等)。用户应该能够选择自己喜欢的社交网络,并使用OAuth2授权框架登录。 我正在使用这里描述的方法实现上述功能 目前我的application.yml如下所示 spring: oauth2: client: clientId: {{my app's google id} clientSecret: {{my app's google

我正在实现一个SpringBoot应用程序,它需要提供OAuth2令牌授权并支持多种社会服务(google+、facebook等)。用户应该能够选择自己喜欢的社交网络,并使用OAuth2授权框架登录。 我正在使用这里描述的方法实现上述功能

目前我的application.yml如下所示

spring:
  oauth2:
    client:
      clientId: {{my app's google id}
      clientSecret: {{my app's google secret code}} 
  etc...
另外,spring boot主类被注释为@EnableOAuth2Sso

我的问题是,使用上述方法,我只能使用一个社交网络来实现我的目的(示例中为google+)。因此,我想知道是否有一种方法可以通过在.yml文件中定义多个社交网络来同时支持它们。 这是可能的还是我应该使用另一种方法

谢谢你抽出时间


Chris

@enableAuth2sso
功能的设计不是为了支持多个提供者作为简单的YAML声明。您需要在安全配置中安装两个独立的
OAuth2AuthenticationProcessingFilters
,每个都有不同的登录路径,然后从UI链接到它们。

我还偶然发现了这一点以及许多其他有关多身份验证提供程序支持的问题。Syer的回答是core
@EnableOAuth2Sso
注释不是为此而设计的,这实际上非常有用。这让我想到别的地方

得益于NimbusOAuth库,我设计了另一种方法。它可能不干净也不漂亮,但它符合我的计划。单独的身份验证提供程序在属性中定义,并根据URI路径进行选择

这就是我想到的:

基本上,提供者是根据SecurityConfiguration(默认软件包)中的
DelegatingAuthenticationProviderEndpoint
所做的决定来选择的
AuthenticationProcessingFilter
正在等待身份验证事件并重定向到身份验证提供程序。返回时,它将验证收到的代码,并携带
AuthenticationToken
供自定义
AuthenticationProvider
评估

收到的UserDetails将持久化到映射中的用户对象


希望这能有所帮助。

您提供的链接仅显示了如何使用@EnableOAuth2Sso工具来启用单个身份验证服务器提供程序。要实现多个提供程序,您应遵循以下步骤:


并为每个提供者实现一个过滤器

事实上,请查看马里奥发布的链接(不知道为什么会被否决……):

这个链接说@enableAuth2sso本质上是@enableAuth2Client和一些附加魔法的组合。缺点是您无法轻松自定义其行为以支持多个提供者。因此,在本教程中,建议将其替换为@enableouth2client,并通过一些自定义添加重复@enableouth2sso在引擎盖下所做的操作

下面是它的样子:

@SpringBootApplication
@EnableOAuth2Client
@RestController
public class SocialApplication extends WebSecurityConfigurerAdapter {

   private Filter ssoFilter() {
      CompositeFilter filter = new CompositeFilter();
      List<Filter> filters = new ArrayList<>();
      filters.add(ssoFilter(facebook(), "/login/facebook"));
      filters.add(ssoFilter(github(), "/login/github"));
      filter.setFilters(filters);
      return filter;
    }



 private Filter ssoFilter(ClientResources client, String path) {
      OAuth2ClientAuthenticationProcessingFilter filter = new OAuth2ClientAuthenticationProcessingFilter(path);
      OAuth2RestTemplate template = new OAuth2RestTemplate(client.getClient(), oauth2ClientContext);
      filter.setRestTemplate(template);
      filter.setTokenServices(new UserInfoTokenServices(
          client.getResource().getUserInfoUri(), client.getClient().getClientId()));
      return filter;
    }

  @Bean
    @ConfigurationProperties("github")
    public ClientResources github() {
      return new ClientResources();
    }

  @Bean
    @ConfigurationProperties("facebook")
    public ClientResources facebook() {
      return new ClientResources();
    }

我有一个类似的需求,并计划在未来拥有AngularJS前端和mobo客户端。我不知道是走这条路,还是使用SpringSocial。了解两者之间的比较可能会非常有帮助。感谢您的回答(以及您令人敬畏的spring项目/模块)Dave!我使用基于
OAuth2ProtectedResourceDetails
的rest模板
OAuth2RestTemplate
使用
OAuth2ClientAuthenticationProcessingFilter
进行了一些实验,但在OAuth2舞蹈的最后一步中,我无法获得令牌。不过,我将尝试基于这种方法完成代码。与注释相关的另一个问题是:如何使用另一个端口让
@enableAuth2sso
与之一起工作(例如9000)?@Sanjay您对Spring Social有何看法?我试图使用它,但它似乎非常不稳定。我在运行来自官方文档和github的代码时遇到了问题!不久前,我曾在Facebook上试用过,结果发现效果很好()。但我也感觉到项目进展缓慢。看来重要的bug会持续存在很长时间。例如,昨天我克隆并运行了您的项目!这是唯一一个,我设法工作和修改,感谢这一点!即使在使用官方示例时遇到问题,我也害怕在自己的项目中使用Spring社交软件包。我觉得这个项目是为了让程序员用5行代码实现“连接到Facebook”功能而创建的,但是如果需要其他任何东西,问题就开始了。你可能需要编辑一些突出显示的部分来说明问题。
class ClientResources {

  @NestedConfigurationProperty
  private AuthorizationCodeResourceDetails client = new AuthorizationCodeResourceDetails();

  @NestedConfigurationProperty
  private ResourceServerProperties resource = new ResourceServerProperties();

  public AuthorizationCodeResourceDetails getClient() {
    return client;
  }

  public ResourceServerProperties getResource() {
    return resource;
  }
}

facebook:
  client:
    clientId: 233668646673605
    clientSecret: 33b17e044ee6a4fa383f46ec6e28ea1d
    accessTokenUri: https://graph.facebook.com/oauth/access_token
    userAuthorizationUri: https://www.facebook.com/dialog/oauth
    tokenName: oauth_token
    authenticationScheme: query
    clientAuthenticationScheme: form
  resource:
    userInfoUri: https://graph.facebook.com/me
github:
  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