【发布时间】:2018-10-12 18:00:19
【问题描述】:
我正在尝试借助 Spring 的 RestTemplate 访问 RestAPI-Endpoint
public List<Transaction> getTransactions() {
// only a 24h token for the sandbox, so not security critical
// still I replaced the last 10 digits here with 'x' but not in my original code
String authToken = "tylhtvGM6Duy8q0ZBbGaTg2FZefLfyeEeMZvCXlU2bEiinnZcLSACTxxxxxxxxxx";
String encodedAuthToken = Base64.getEncoder().encodeToString(authToken.getBytes());
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
headers.add("Authorization", "Bearer "+encodedAuthToken );
ResponseEntity<TransactionsResponse> response = restTemplate.exchange(
"https://api-sandbox.starlingbank.com/api/v1/transactions",
HttpMethod.GET,
new HttpEntity<>("parameters", headers),
TransactionsResponse.class
);
return response.getBody().getEmbedded().getTransactions();
}
但我得到一个 HttpClientErrorException 说“403 Forbidden”。 长版
Caused by: org.springframework.web.client.HttpClientErrorException: 403 Forbidden
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:94) ~[spring-web-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:79) ~[spring-web-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63) ~[spring-web-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:766) ~[spring-web-5.0.8.RELEASE.jar:5.0.8.RELEASE]
我的代码基于former stackoverflow thread,并且通过 Postman 使用相同参数的调用成功:
那么问题出在哪里?
更新
不编码 authToken 没有区别
headers.add("Authorization", "Bearer tylhtvGM6Duy8q0ZBbGaTg2FZefLfyeEeMZvCXlU2bEiinnZcLSACTxxxxxxxxxx");
仍然导致同样的HttpClientErrorException: 403 Forbidden
更新2
我回答了我的问题! (短版:需要 UserAgent。anwser 中的最终代码)
【问题讨论】:
-
在文档link 中说这个 Http 状态代码 403 = Forbidden 您的身份验证失败,通常是由于访问令牌已过期或尝试访问超出令牌范围的资源。您是否有对此范围具有权限的令牌?还是在这两种情况下都使用相同的令牌?
-
正如您在 Postman 屏幕截图中看到的那样,我使用相同的 authToken。而且我现在仍然使用 Postman 成功,所以令牌在几个小时内仍然有效(之后我可以简单地更新它)。
标签: spring authorization resttemplate