【发布时间】:2015-06-24 03:43:50
【问题描述】:
我们想要设置一个提供 REST API 的微服务,以便将其配置为 OAuth2 资源服务器。此服务还应充当具有客户端凭据授权的 OAuth2 客户端。这是配置:
spring.oauth2.client.id=clientCredentialsResource
spring.oauth2.client.accessTokenUri=http://localhost:9003/oauth/token
spring.oauth2.client.userAuthorizationUri=http://localhost:9003/oauth/authorize
spring.oauth2.client.grantType=client_credentials
spring.oauth2.client.clientId=<service-id>
spring.oauth2.client.clientSecret=<service-pw>
资源服务器部分工作正常。对于客户端部分,我们想使用 Feign、Ribbon 和 Eureka:
@FeignClient("user")
public interface UserClient
{
@RequestMapping( method = RequestMethod.GET, value = "/user/{uid}")
Map<String, String> getUser(@PathVariable("uid") String uid);
}
基于问题https://github.com/spring-cloud/spring-cloud-security/issues/56 中的要点,我创建了一个假装请求拦截器,它从假装请求标头中的自动连接的 OAuth2RestOperations 模板设置访问令牌
@Autowired
private OAuth2RestOperations restTemplate;
template.header(headerName, String.format("%s %s", tokenTypeName, restTemplate.getAccessToken().toString()));
但这给了我调用用户服务的错误:
error="access_denied", error_description="Unable to obtain a new access token for resource 'clientCredentialsResource'. The provider manager is not configured to support it.
正如我所见,OAuth2ClientAutoConfiguration 始终为 Web 应用程序创建 AuthorizationCodeResourceDetails 实例,而不是仅用于非 Web 应用程序的必需 ClientCredentialsResourceDetails 实例。最后,无访问令牌提供者负责资源详细信息,并且调用失败
AccessTokenProviderChain.obtainNewAccessTokenInternal(AccessTokenProviderChain.java:146)
我试图覆盖自动配置但失败了。有人可以给我一个提示吗?
【问题讨论】:
标签: spring spring-security spring-boot spring-security-oauth2 spring-cloud