【问题标题】:Revoke token. RestTemplate using issue撤销令牌。 RestTemplate 使用问题
【发布时间】:2017-07-03 14:29:21
【问题描述】:

我正在尝试撤销API"Content-type:application/x-www-form-urlencoded",请求类型POSThttps://accounts.google.com/o/oauth2/revoke?token={token})之后的谷歌令牌。

我的代码示例是:

private static final String REVOKE_URL = "https://accounts.google.com/o/oauth2/revoke";
private static final String TOKEN = "token";
@Autowired
private RestTemplate restTemplate;

public void revokeToken(TokenDetailsDto tokenDetailsDto) {
    HttpHeaders headers = new HttpHeaders();
    headers.add(CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED_VALUE);
    HttpEntity<?> entity = new HttpEntity(headers);
    Map<String, String> parameters = new HashMap<>();
    parameters.put(TOKEN, tokenDetailsDto.getRefreshToken());
    LOGGER.info("used parameters:\n\turl={},\n\tentity={},\n\turiParameters={}", REVOKE_URL, entity, uriParameters);
    restTemplate.exchange(REVOKE_URL, HttpMethod.GET, entity, Void.class, parameters);
}

结果异常:

17:30:54,323 INFO  # com.nextiva.calendar.client.google.GoogleRevokeAccessService.revokeToken used parameters:
  url=https://accounts.google.com/o/oauth2/revoke,
  entity=<{Content-Type=[application/x-www-form-urlencoded]}>,
  uriParameters={token=1/mzMH8VPrltarCo3LOHU_tBWi4qK5e20uIM0R_Al9T34}
17:31:20,718 ERROR # com.nextiva.calendar.web.error.handling.BaseExceptionHandler.exception 400 Bad Request
org.springframework.web.client.HttpClientErrorException: 400 Bad Request
  at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:63)
  at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:700)
  at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:653)
  at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:621)
  at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:540)

我尝试使用休息客户端来处理文档中的请求,这没关系(使用休息客户端我尝试使用具有指定内容类型的 POST 请求)。

如果我使用同样的错误结果

restTemplate.postForEntity(REVOKE_URL, entity, Void.class, uriParameters);

所以问题在于restTemplate 使用(我的弹簧部分)。有什么想法吗,我在这里做错了什么?

【问题讨论】:

    标签: java spring rest google-api-client spring-rest


    【解决方案1】:

    解决办法是:

        HttpHeaders headers = new HttpHeaders();
        headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED_VALUE);
        HttpEntity<?> entity = new HttpEntity(headers);
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(REVOKE_URL)
                .queryParam("token", tokenDetailsDto.getRefreshToken());
        LOGGER.info("used parameters:\n\turl={},\n\tentity={},\n\turiParameters={}", REVOKE_URL, entity);
        restTemplate.postForObject(builder.build().encode().toUri(), entity, Void.class);
    

    小解释:服务期望urlParameters,但是parameters不是urlParameters,它的请求参数。所以我使用UriComponentsBuilder 来构建正确的请求。

    【讨论】:

      猜你喜欢
      • 2019-04-12
      • 2016-08-17
      • 1970-01-01
      • 2020-09-29
      • 2014-10-26
      • 2015-03-06
      • 2015-04-16
      • 1970-01-01
      相关资源
      最近更新 更多