EnableOAuth2Sso simultaneously for multiple social networks

后端 未结 4 2051
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-19 18:22

I am implementing a spring boot application that needs to provide OAuth2 token authorization and support multiple social services (google+, facebook etc). The user should be

4条回答
  •  失恋的感觉
    2020-12-19 19:09

    Indeed, please check the link posted by Mario (not sure why it was downvoted..): social_login_manual

    The link says that @EnableOAuth2Sso is essentially a combination of @EnableOAuth2Client and some additional magic. The downside is you can't easily customize its behavior to support multiple providers. Thus in the tutorial it is suggested to replace it with @EnableOAuth2Client instead and go by repeating what @EnableOAuth2Sso does under the hood with some custom additions.

    So, here is how it looks like:

    @SpringBootApplication
    @EnableOAuth2Client
    @RestController
    public class SocialApplication extends WebSecurityConfigurerAdapter {
    
       private Filter ssoFilter() {
          CompositeFilter filter = new CompositeFilter();
          List 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();
        }
    

    }

    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
    

提交回复
热议问题