我正在实现一个spring引导应用程序,它需要提供OAuth2令牌授权并支持多种社交服务(google+、facebook等)。用户应该能够选择他喜欢的社交网络并使用OAuth2授权框架进行登录。我正在使用这里描述的方法来实现上述http://cloud.spring.io/spring-cloud-security/。
目前,我的application.yml看起来像这样
spring:
oauth2:
client:
clientId: {{my app's google id}
clientSecret: {{my app's google secret code}}
etc...此外,spring引导主类被注释为@EnableOAuth2Sso。
我的问题是,使用上述方法,我只能使用一个社交网络来实现我的目的(示例中是google+)。因此,我想知道是否有一种方法同时支持多个社交网络,通过在.yml文件中定义它们。这是可能的还是我应该使用另一种方法?
耽误您时间,实在对不起,
克里斯
发布于 2015-11-09 07:32:14
@EnableOAuth2Sso特性的设计并不能像简单的YAML声明那样支持多个提供者。您不需要在您的安全配置中安装两个单独的OAuth2AuthenticationProcessingFilters,每个配置都有一个不同的登录路径,然后从一个UI链接到它们。
发布于 2016-10-27 02:03:09
实际上,请查看Mario发布的链接(不确定为什么投票被否决):手册
链接说@EnableOAuth2Sso本质上是@EnableOAuth2Client和一些额外魔术的结合。缺点是您无法轻松地自定义它的行为以支持多个提供者。因此,在本教程中,建议将其替换为@EnableOAuth2Client,然后重复@EnableOAuth2Sso在引擎盖下所做的操作,并添加一些自定义内容。
所以,下面是它的样子:
@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();
}}
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发布于 2016-07-08 13:09:46
https://stackoverflow.com/questions/33512401
复制相似问题