我正在尝试使用 Spring Secruity 的 OAuth API 从外部发布的 API 获取访问 token 。
此 curl 命令有效(其内容是我获取访问 token 所需的全部内容):
curl -X POST \
https://api.app.com/v1/oauth/token \
-H 'content-type: application/x-www-form-urlencoded' \
-d'grant_type=client_credentials&client_id=bcfrtew123&client_secret=Y67493012'
运行此 curl 命令后,我能够从外部服务获取访问 token 。
当使用 Spring Security OAuth API 时:
<dependency>
<groupId>org.springframework.security.oauth</groupId>
<artifactId>spring-security-oauth2</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
像这样设置我的 SpringMVC Controller 的方法:
@RequestMapping(value = "/getAccessToken", method = RequestMethod.POST, consumes="application/x-www-form-urlencoded")
public OAuth2AccessToken getAccessToken(@RequestParam(value="client_id", required=true) String clientId, @RequestParam(value="client_secret", required=true) String clientSecret) throws Exception {
String tokenUri = "https://api.app.com/v1/oauth/token";
ResourceOwnerPasswordResourceDetails resourceDetails = new ResourceOwnerPasswordResourceDetails();
resourceDetails.setAccessTokenUri(tokenUri);
resourceDetails.setClientId(clientId);
resourceDetails.setClientSecret(clientSecret);
resourceDetails.setGrantType("client_credentials");
resourceDetails.setScope(Arrays.asList("read", "write"));
DefaultOAuth2ClientContext clientContext = new DefaultOAuth2ClientContext();
oauth2RestTemplate = new OAuth2RestTemplate(resourceDetails, clientContext);
OAuth2AccessToken token = oauth2RestTemplate.getAccessToken();
return token;
}
当我从本地 tomcat 实例调用 getAccessToken 时:
access_denied
error_description=Unable to obtain a new access token for resource 'null'.
The provider manager is not configured to support it.
问题:
- 我在这里错过了什么?这需要一些注释吗?是否有未设置或需要的属性?
(请注意内容类型需要是“application/x-www-form-urlencoded”...)
如何使用 Spring Security OAuth API 模拟有效的 curl 命令?
会不会是我在RequestParameters中设置的默认值?
如果成功,我如何设置它以便在发出任何请求之前始终预加载访问 token ?
最佳答案
真正的原因是,您正在使用 ResourceOwnerPasswordResourceDetails
对于 "client_credentials"
访问 token 请求。我们不能互换ResourceOwnerPasswordResourceDetails
和 ClientCredentialsResourceDetails
.
在ClientCredentialsResourceDetails
你需要设置 AccessTokenUri, ClientId, ClientSecret
和 grantType
.
在 ResourceOwnerPasswordResourceDetails
, 你需要提供 Username and Password
连同 AccessTokenUri, ClientId, ClientSecret
和 GrantType
.
(一些授权服务器确实接受 password
没有 username and password
的 token 请求 .. 但我会说这是错误的)
关于java - Spring Security OAuth - 未为空资源配置提供者管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44961680/