gpt4 book ai didi

java - Spring 安全 OAuth2 样本中的缺陷 : same OAuth2ClientContext used for several providers

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:49:54 25 4
gpt4 key购买 nike

我尝试用 Spring Security 实现 OAuth2,我研究了以下 Github 中 Spring 提供的示例: https://github.com/spring-projects/spring-security-oauth/blob/master/samples/oauth2/tonr/src/main/java/org/springframework/security/oauth/examples/config/WebMvcConfig.java

这个 OAuth2 示例分为两个项目:

  • tonr:OAuth2 客户端(OAuth2Client)和
  • sparklr:OAuth2 提供程序(ResourceServer 和 AuthorizationServer)

Tonr 允许显示来自 Sparklr 的照片,还包括一个 Facebook API 客户端来列出一个帐户的 friend 。似乎一旦从一个提供者处获得,相同的 token 就会发送到所有 OAuth2 提供者,即使该 token 并非来自被调用的提供者。

步骤:

  • 我登录 tonr2 (localhost:8080/tonr2/login.jsp)
  • 我转到 Sparklr photos 并登录 sparklr2 (localhost:8080/tonr2/sparklr/photos & localhost:8080/sparklr2/login.jsp)
  • 我同意范围阅读并且我看到照片:好的
  • 然后我转到 Facebook 好友页面:localhost:8080/tonr2/facebook/info

sparklr token 被发送到 Facebook(在调试日志中可见),显然 Facebook 返回了 400 Bad Request Error。

如果现在,我从 tonr 注销,直接点击 Facebook 好友页面并再次登录 tonr,就可以了;向 Facebook 请求 token 并授予访问权限。因此相同的 OAuth2ClientContext 和相同的 token 从 Sparklr 保存到 Facebook。

问题:如何分离 OAuth2ClientContext 以将 token 保留在其各自的资源服务器中?

我试图为 facebookRestTemplate 实例化一个不同的 OAuth2ClientContext bean,但是 OAuth2 流程被打破了:

@Bean(name = "facebookClientContext")
public OAuth2ClientContext facebookClientContext() {
return new DefaultOAuth2ClientContext();
}

@Bean
public OAuth2RestTemplate facebookRestTemplate(@Qualifier("facebookClientContext") OAuth2ClientContext clientContext) {
...

最佳答案

我遇到了同样的问题。我和你一样解决了它,除了你应该:

  1. 在 DefaultOAuth2ClientContext 的构造函数中注入(inject)一个 AccessTokenRequest(请求范围)。 (@Resource 注入(inject)在这个版本的 Spring 中是必需的,因为 AccessTokenRequest 是一个 Map)。
  2. session-scope 您的 facebookClientContext 不在不同用户之间共享 token 。

请参阅 OAuth2ClientConfiguration 作为指南。

修改您的 WebMvcConfig$ResourceConfiguration:

    @Resource(name = "accessTokenRequest")
private AccessTokenRequest accessTokenRequest;

@Bean
@Qualifier("facebookClientContext")
@Scope(value = "session", proxyMode = ScopedProxyMode.INTERFACES)
public DefaultOAuth2ClientContext facebookClientContext() {
return new DefaultOAuth2ClientContext(accessTokenRequest);
}

@Bean
public OAuth2RestTemplate facebookRestTemplate(
@Qualifier("facebookClientContext") OAuth2ClientContext clientContext) {
OAuth2RestTemplate template = new OAuth2RestTemplate(facebook(), clientContext);
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setSupportedMediaTypes(
Arrays.asList(MediaType.APPLICATION_JSON, MediaType.valueOf("text/javascript")));
template.setMessageConverters(Arrays.<HttpMessageConverter<?>>asList(converter));
return template;
}

@Bean
public OAuth2RestTemplate sparklrRestTemplate(
@Qualifier("oauth2ClientContext") OAuth2ClientContext clientContext) {
return new OAuth2RestTemplate(sparklr(), clientContext);
}

@Bean
public OAuth2RestTemplate sparklrRedirectRestTemplate(
@Qualifier("oauth2ClientContext") OAuth2ClientContext clientContext) {
return new OAuth2RestTemplate(sparklrRedirect(), clientContext);
}

关于java - Spring 安全 OAuth2 样本中的缺陷 : same OAuth2ClientContext used for several providers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45382692/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com