J'essaie d'accéder à un RestAPI-Endpoint avec l'aide de Spring's RestTemplate
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();
}
mais j'obtiens une HttpClientErrorException disant "403 Forbidden". Version longue
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]
Mon code est basé sur un ancien thread stackoverflow et un appel avec les mêmes paramètres via Postman a réussi:
Alors quel est le problème?
Mise à jour
ne pas encoder l'authToken ne fait aucune différence
headers.add("Authorization", "Bearer tylhtvGM6Duy8q0ZBbGaTg2FZefLfyeEeMZvCXlU2bEiinnZcLSACTxxxxxxxxxx");
conduit toujours à la même HttpClientErrorException: 403 Forbidden
Update2
J'ai répondu à ma question! (version courte: UserAgent requis. code final dans la réponse)
ce serveur particulier nécessite un UserAgent! La valeur peut être n'importe quoi, mais elle doit être présente!
La version finale est donc:
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";
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
headers.add("User-Agent", "Spring's RestTemplate" ); // value can be whatever
headers.add("Authorization", "Bearer "+authToken );
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();
}
Si vous utilisez OAuth jetons de support pour l'authentification, vous n'avez pas besoin de les coder avant de faire la demande. La ligne suivante devrait être suffisante:
headers.add("Authorization", "Bearer " + authToken);
Le code que vous avez mentionné a une authentification Http Basic qui consiste à envoyer les informations d'identification en tant que username:password
paire encodée en Base64.
Vous codez votre jeton en Base64 et son déjà codé, votre code est basé sur this mais dans cet exemple, ils codent un en-tête d'autorisation de base avec (utilisateur: mot de passe) codé
sonder cela
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
headers.add("Authorization", "Bearer "+ authToken );