带有X-www-form-urlencoded POST 401的Spring OAuthRestTemplate未经授权

时间:2018-07-21 02:25:00

标签: spring spring-security

我目前正在尝试与使用OAuth1.0a的API集成。我已经使用适当的使用者密钥,令牌和机密配置了OAuthRestTemplate。对于我尝试过的所有GET和DELETE请求,正确生成了授权标头。

但是,API在某些端点上使用了x-www-form-urlencoded形式的POST。这将导致401未经授权。似乎在签署请求时未考虑POST正文。我是否缺少配置或这是一个错误?在获取参数并将其放置在URL的查询参数中时,将正确生成标头。

RestTemplate Bean

  @Bean
  public OAuthRestTemplate oAuthRestTemplate() {
    BaseProtectedResourceDetails protectedResourceDetails = new BaseProtectedResourceDetails();
    protectedResourceDetails.setConsumerKey(this.consumerKey);
    protectedResourceDetails.setSharedSecret(new SharedConsumerSecretImpl(this.consumerSecret));

    OAuthRestTemplate oAuthRestTemplate = new OAuthRestTemplate(protectedResourceDetails);

    OAuthConsumerToken accessToken = new OAuthConsumerToken();
    accessToken.setAccessToken(true);
    accessToken.setValue(this.token);
    accessToken.setSecret(this.secret);

    OAuthSecurityContextImpl securityContext = new OAuthSecurityContextImpl();
    securityContext.setAccessTokens(new HashMap<>());
    securityContext.getAccessTokens().put(accessToken.getResourceId(), accessToken);
    OAuthSecurityContextHolder.setContext(securityContext);

    SimpleClientHttpRequestFactory simpleClientHttpRequestFactory =  new SimpleClientHttpRequestFactory();
    simpleClientHttpRequestFactory.setOutputStreaming(false);
    oAuthRestTemplate.setRequestFactory(new BufferingClientHttpRequestFactory(simpleClientHttpRequestFactory));
    oAuthRestTemplate.setInterceptors(Collections.singletonList(new RequestLoggingInterceptor()));

    return oAuthRestTemplate;
  }

使用模板的API调用

    String uri = UriComponentsBuilder.fromHttpUrl(this.baseUrl).path("/api/v4/media/{mediaId}/").buildAndExpand(mediaId).toUriString();

    MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
    params.add("name", "Test Name");
    params.add("description", "Test Description");

    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
    HttpEntity<MultiValueMap<String, String>> entity = new HttpEntity(params, headers);

    ResponseEntity<AssetUpdate> response = this.oAuthRestTemplate.postForEntity(uri, entity, AssetUpdate.class);

Maven依赖关系Spring 2.0.3.RELEASE

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>${spring.version}</version>
  </dependency>

  <dependency>
    <groupId>org.springframework.security.oauth</groupId>
    <artifactId>spring-security-oauth</artifactId>
    <version>${spring.version}</version>
  </dependency>

  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
  </dependency>
</dependencies>

0 个答案:

没有答案
相关问题