Базовая аутентификация для REST API с помощью spring restTemplate

Я полностью новичок в RestTemplate и в основном в REST API. Я хочу получить некоторые данные в своем приложении через Jira REST API, но вернусь 401 Unauthorized. Найдено и статья о jira rest api documentation, но на самом деле не знаю, как переписать это в java, так как пример использует путь командной строки с curl. Я был бы признателен за любое предложение или совет, как переписать:

curl -D- -X GET -H "Authorization: Basic ZnJlZDpmcmVk" -H "Content-Type: application/json" "http://kelpie9:8081/rest/api/2/issue/QA-31"

в java с использованием шаблона отдыха spring. Где ZnJlZDpmcmVk - строка с кодировкой base64 с именем пользователя: password. Большое вам спасибо.

Ответ 1

Взятый из примера на этом сайте, я думаю, что это был бы самый естественный способ сделать это, заполнив значение заголовка и передавая заголовок шаблону.

Это для заполнения заголовка Authorization:

String plainCreds = "willie:[email protected]";
byte[] plainCredsBytes = plainCreds.getBytes();
byte[] base64CredsBytes = Base64.encodeBase64(plainCredsBytes);
String base64Creds = new String(base64CredsBytes);

HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", "Basic " + base64Creds);

И это передать заголовок шаблону REST:

HttpEntity<String> request = new HttpEntity<String>(headers);
ResponseEntity<Account> response = restTemplate.exchange(url, HttpMethod.GET, request, Account.class);
Account account = response.getBody();

Ответ 2

Вы можете использовать подпружиненный загрузчик RestTemplateBuilder

@Bean
RestOperations rest(RestTemplateBuilder restTemplateBuilder) {
    return restTemplateBuilder.basicAuthentication("user", "password").build();
}

См. документацию

.(до SB 2.1.0 это было #basicAuthorization)

Ответ 3

(возможно) самый простой способ без импорта подпружиненного загрузчика.

restTemplate.getInterceptors().add(new BasicAuthorizationInterceptor("user", "password"));

Ответ 4

Ссылочная реализация Spring Boot TestRestTemplate выглядит следующим образом:

https://github.com/spring-projects/spring-boot/blob/v1.2.2.RELEASE/spring-boot/src/main/java/org/springframework/boot/test/TestRestTemplate.java

В частности, см. метод addAuthentication() следующим образом:

private void addAuthentication(String username, String password) {
    if (username == null) {
        return;
    }
    List<ClientHttpRequestInterceptor> interceptors = Collections
            .<ClientHttpRequestInterceptor> singletonList(new BasicAuthorizationInterceptor(
                    username, password));
    setRequestFactory(new InterceptingClientHttpRequestFactory(getRequestFactory(),
            interceptors));
}

Точно так же вы можете легко создать свой собственный RestTemplate

по наследству, как TestRestTemplate следующим образом:

https://github.com/izeye/samples-spring-boot-branches/blob/rest-and-actuator-with-security/src/main/java/samples/springboot/util/BasicAuthRestTemplate.java

Ответ 5

С весны 5.1 вы можете использовать HttpHeaders.setBasicAuth

Создать заголовок базовой авторизации:

String username = "willie";
String password = ":[email protected]";
HttpHeaders headers = new HttpHeaders();
headers.setBasicAuth(username, password);
...other headers goes here...

Передайте заголовки в шаблон RestTemplate:

HttpEntity<String> request = new HttpEntity<String>(headers);
ResponseEntity<Account> response = restTemplate.exchange(url, HttpMethod.GET, request, Account.class);
Account account = response.getBody();

Документация:https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/http/HttpHeaders.html#setBasicAuth-java.lang.String-java.lang.String-

Ответ 6

Вместо создания экземпляра следующим образом:

TestRestTemplate restTemplate = new TestRestTemplate();

Просто сделайте это так:

TestRestTemplate restTemplate = new TestRestTemplate(user, password);

Это работает для меня, я надеюсь, что это поможет!

Ответ 7

Существует несколько способов добавить базовую HTTP-аутентификацию в RestTemplate.

1. Для одного запроса

try {
    // request url
    String url = "https://jsonplaceholder.typicode.com/posts";

    // create auth credentials
    String authStr = "username:password";
    String base64Creds = Base64.getEncoder().encodeToString(authStr.getBytes());

    // create headers
    HttpHeaders headers = new HttpHeaders();
    headers.add("Authorization", "Basic " + base64Creds);

    // create request
    HttpEntity request = new HttpEntity(headers);

    // make a request
    ResponseEntity<String> response = new RestTemplate().exchange(url, HttpMethod.GET, request, String.class);

    // get JSON response
    String json = response.getBody();

} catch (Exception ex) {
    ex.printStackTrace();
}

Если вы используете Spring 5.1 или выше, вам больше не нужно вручную устанавливать заголовок авторизации. Вместо этого используйте метод headers.setBasicAuth():

// create headers
HttpHeaders headers = new HttpHeaders();
headers.setBasicAuth("username", "password");

2. Для группы запросов

@Service
public class RestService {

    private final RestTemplate restTemplate;

    public RestService(RestTemplateBuilder restTemplateBuilder) {
        this.restTemplate = restTemplateBuilder
                .basicAuthentication("username", "password")
                .build();
    }

   // use 'restTemplate' instance here
}

3. Для каждого запроса

@Bean
RestOperations restTemplateBuilder(RestTemplateBuilder restTemplateBuilder) {
    return restTemplateBuilder.basicAuthentication("username", "password").build();
}

Надеюсь, это поможет!