2014-02-20 3 views
32

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

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

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

+0

Смотри также http://stackoverflow.com/questions/9376549/resttemplate-basic-or-digest-authentication-with-the -current-httpclient-4-x – Raedwald

+2

curl поддерживает аутентификацию из коробки, вам просто нужно указать ему имя пользователя и пароль 'curl -u fred: fred', без необходимости неуклюжих заголовков. То же самое касается Spring. – divanov

ответ

81

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

Это заполнить заголовок 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(); 
+0

Спасибо - это сработало для меня. Я должен был указать, что если вы не хотите использовать класс org.apache.commons.codec.binary.Base64, и вместо этого вы хотели бы использовать класс base64 для Android: import android.util.Base64 ;, вы можете заменить одна строка выше с этим: byte [] base64CredsBytes = Base64.encode (plainCredsBytes, Base64.DEFAULT); – Simon

+0

@jhadesdev Привет, это сработало для меня при выполнении запроса GET. Хотя он не дает 403, когда в должности. Вы можете мне помочь? –

+1

@StefanoCazzola https: //gist.github.com/felixebert/12d1f637e309660dcfdd –

15

Ссылка Spring TestRestTemplate реализации ботинка следующим образом:

https://github.com/spring-projects/spring-boot/blob/master/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

6

Вместо с использованием следующих методов:

TestRestTemplate restTemplate = new TestRestTemplate(); 

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

TestRestTemplate restTemplate = new TestRestTemplate(user, password); 

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

+0

TestRestTemplate, похоже, не работает после обновления весеннего ботинка до 1.3.x –

17

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

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

См documentation

+0

Вы сохранили мой день. Большое спасибо. –

+1

Спасибо! Это самый быстрый и простой способ. – Raj

Смежные вопросы