web-dev-qa-db-fra.com

Définition de l'en-tête d'autorisation dans Spring RestTemplate

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: enter image description here

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)

3
StephanS

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();
}
6
StephanS

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.

0

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 );
0
Fernix