我想知道是否有人举例说明如何使用Spring Cloud Security(使用OAuth2)实现"令牌交换"技术.
目前,我已经在微服务环境中使用ZuulProxy实现了"令牌中继"技术,以"中继"OAuth2令牌并实现SSO.这很好,但暗示每个微服务使用相同的clientId(在ZuulProxy设置中指定为ZuulProxy仅使用authorization_code grant类型和clientId提供的中继).但是,对于微服务内部调用,我想"交换"令牌.这意味着在某些情况下,ZuulProxy中继的令牌不是我需要用来验证/授权微服务A作为微服务B的客户端的令牌.
Spring Cloud参考文档目前说:"基于Spring Boot和Spring Security OAuth2,我们可以快速创建实现常见模式的系统,如单点登录,令牌中继和令牌交换." (http://cloud.spring.io/spring-cloud-security/spring-cloud-security.html)
我想在参考文档中使用"Token Exchange"它们意味着OAuth2的这个扩展的实现,在本规范中解释,这基本上是我需要的:https: //tools.ietf.org/html/draft-ietf- OAuth的令牌交换-03
正如我所说,我了解如何使用SSO和令牌中继,但我无法在参考文档中看到有关如何实现"令牌交换"的进一步说明.我也无法找到实现示例.
有谁知道在哪里可以找到更多信息或示例?
非常感谢!
我正在尝试使用OAuth2设置FeignClient来实现“中继令牌”。我只希望FeignClient中继/传播来自ZuulProxy(已启用SSO)的OAuth2令牌。我使用Spring 1.3.1-RELEASE和Spring Cloud Brixton.M4。
我在自定义@FeignClient配置中添加了一个拦截器:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.security.oauth2.client.feign.OAuth2FeignRequestInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.oauth2.client.OAuth2ClientContext;
import org.springframework.security.oauth2.client.resource.OAuth2ProtectedResourceDetails;
import org.springframework.security.oauth2.client.token.grant.code.AuthorizationCodeResourceDetails;
import feign.RequestInterceptor;
@Configuration
public class FeignClientConfiguration {
@Value("${security.oauth2.client.userAuthorizationUri}")
private String authorizeUrl;
@Value("${security.oauth2.client.accessTokenUri}")
private String tokenUrl;
@Value("${security.oauth2.client.client-id}")
private String clientId;
// See https://github.com/spring-cloud/spring-cloud-netflix/issues/675
@Bean
public RequestInterceptor oauth2FeignRequestInterceptor(OAuth2ClientContext oauth2ClientContext){
return new OAuth2FeignRequestInterceptor(oauth2ClientContext, resource());
}
@Bean
protected OAuth2ProtectedResourceDetails resource() {
AuthorizationCodeResourceDetails resource = new AuthorizationCodeResourceDetails();
resource.setAccessTokenUri(tokenUrl);
resource.setUserAuthorizationUri(authorizeUrl);
resource.setClientId(clientId);
// TODO: Remove this harcode
resource.setClientSecret("secret");
return resource;
}
}
Run Code Online (Sandbox Code Playgroud)
然后像这样将配置添加到我的@FeignClient中:
@FeignClient(name …Run Code Online (Sandbox Code Playgroud)