java - Spring Security OAuth - 未为空资源配置提供者管理器

标签 java spring-mvc curl oauth spring-security-oauth2

我正在尝试使用 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.

问题:

  1. 我在这里错过了什么?这需要一些注释吗?是否有未设置或需要的属性?

(请注意内容类型需要是“application/x-www-form-urlencoded”...)

  1. 如何使用 Spring Security OAuth API 模拟有效的 curl 命令?

  2. 会不会是我在RequestParameters中设置的默认值?

  3. 如果成功,我如何设置它以便在发出任何请求之前始终预加载访问 token ?

最佳答案

真正的原因是,您正在使用 ResourceOwnerPasswordResourceDetails对于 "client_credentials"访问 token 请求。我们不能互换ResourceOwnerPasswordResourceDetailsClientCredentialsResourceDetails .

ClientCredentialsResourceDetails你需要设置 AccessTokenUri, ClientId, ClientSecretgrantType . 在 ResourceOwnerPasswordResourceDetails , 你需要提供 Username and Password连同 AccessTokenUri, ClientId, ClientSecretGrantType .

(一些授权服务器确实接受 password 没有 username and password 的 token 请求 .. 但我会说这是错误的)

引用:Securing an existing API with our own solution

关于java - Spring Security OAuth - 未为空资源配置提供者管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44961680/

相关文章:

javascript - 使用jQuery在jsp中动态加载spring复选框标签时出错

java - 使用 Spring MVC 和 Html 上传图片

php - CURL MULTI - 为什么有两个循环?

java - 使用 URL 更新组件

java - Spring 404运行教程

c++ - 使用 libcurl C++ 从 Twitter 下载图像

java - 无法从简单的 Java 代理服务器查看数据

java - 不同设备上的游戏速度不一样

java - 梅文。如何从paren pom.xml继承配置文件?

java - 通过 gmail 从 java 发送电子邮件时出现异常