Базовая аутентификация для 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();
}
Надеюсь, это поможет!