Настройка заголовка авторизации в Spring RestTemplate - PullRequest
0 голосов
/ 12 октября 2018

Я пытаюсь получить доступ к RestAPI-конечной точке с помощью Spring 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();
}

, но я получаю 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]

Мой код основан на прежнем потоке stackoverflow , и вызов с теми же параметрами через Postman выполнен успешно: enter image description here

Так в чем же проблема?

Обновление

без кодировки authToken не имеет значения

headers.add("Authorization", "Bearer tylhtvGM6Duy8q0ZBbGaTg2FZefLfyeEeMZvCXlU2bEiinnZcLSACTxxxxxxxxxx");

все равно приводит к тому же HttpClientErrorException: 403 Запрещено

Обновление2

Я ответил на мой вопрос!(короткая версия: требуется UserAgent. окончательный код в anwser)

Ответы [ 3 ]

0 голосов
/ 13 октября 2018

Если вы используете токены OAuth Bearer для аутентификации, вам не нужно кодировать их перед выполнением запроса.Следующей строки должно быть достаточно:

headers.add("Authorization", "Bearer " + authToken);

Код, который вы упомянули, имеет базовую аутентификацию Http, которая состоит из отправки учетных данных в виде пары username:password, закодированной с Base64.

0 голосов
/ 15 октября 2018

этот конкретный сервер требует UserAgent!Значение может быть любым, но оно должно присутствовать!

Итак, окончательная версия:

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();
}
0 голосов
/ 12 октября 2018

Вы кодируете свой токен в Base64, и он уже закодирован, ваш код основан на this , но в этом примере они кодируют заголовок Basic Authorization с (user: password) в кодировке

зонд это

 HttpHeaders headers = new HttpHeaders();
    headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
    headers.add("Authorization", "Bearer "+ authToken );
...