web-dev-qa-db-fra.com

Authentification de base pour REST utilisant Spring RestTemplate

Je suis complètement nouveau dans RestTemplate et, fondamentalement, dans les API REST également. Je souhaite récupérer des données dans mon application via Jira REST, mais je récupère 401 Trouvé et article sur documentation de jira rest api mais je ne sais pas vraiment comment le réécrire dans Java car l'exemple utilise la méthode de ligne de commande avec curl. I apprécierait toute suggestion ou conseil sur la façon de réécrire:

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

into Java utilisant un gabarit de repos du ressort. Où le ZnJlZDpmcmVk est une chaîne de nom d'utilisateur codée en base64: mot de passe. Merci beaucoup.

62
shippi

Tiré du exemple sur ce site , je pense que ce serait la façon la plus naturelle de le faire, en remplissant la valeur d'en-tête et en passant l'en-tête au modèle.

C'est pour remplir l'en-tête Authorization:

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

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

Et ceci consiste à passer l'en-tête au modèle REST:

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

Vous pouvez utiliser spring-boot RestTemplateBuilder

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

Voir documentation

(avant SB 2.1.0 c'était #basicAuthorization)

61
Alex

(peut-être) le moyen le plus simple sans importer Spring-Boot.

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

Implémentation de TestRestTemplate de Spring Spring comme suit:

https://github.com/spring-projects/spring-boot/blob/master/spring-boot/src/main/Java/org/springframework/boot/test/TestRestTemplate.Java

En particulier, voir la méthode addAuthentication () comme suit:

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));
}

De même, vous pouvez créer votre propre RestTemplate facilement

par héritage comme TestRestTemplate comme suit:

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

17
Johnny Lim

A partir du printemps 5.1, vous pouvez utiliser HttpHeaders.setBasicAuth

En-tête de création d'autorisation de base:

String username = "willie";
String password = ":p@ssword";
HttpHeaders headers = new HttpHeaders();
headers.setBasicAuth(username, password);
...other headers goes here...

Passez les en-têtes au RestTemplate:

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

Documentation: https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/http/HttpHeaders.html#setBasicAuth-Java.lang.String-Java.lang. String -

10
YanivJ

Au lieu d'instancier comme suit:

TestRestTemplate restTemplate = new TestRestTemplate();

Fais-le comme ça:

TestRestTemplate restTemplate = new TestRestTemplate(user, password);

Cela fonctionne pour moi, j'espère que cela aide!

6
Nidham