我目前正在尝试与使用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>