web-dev-qa-db-ja.com

spring restTemplateを使用したREST AP​​Iの基本認証

私はRestTemplateと基本的にREST AP​​Iもまったく新しいです。 Jira REST AP​​Iを使用してアプリケーションのデータを取得したいが、401 Unauthorizedを取得したい。 jira rest api documentation に関する記事が見つかりましたが、例ではcurlでコマンドラインを使用しているため、これをJavaに書き換える方法はわかりません。書き換えの提案やアドバイスをいただければ幸いです。

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

スプリングレストテンプレートを使用してJavaに。 ZnJlZDpmcmVkは、username:passwordのbase64エンコード文字列です。どうもありがとうございました。

62
shippi

このサイトの例 から取られた、ヘッダー値を入力してヘッダーをテンプレートに渡すことにより、これが最も自然な方法だと思います。

これは、ヘッダー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);

そして、これはヘッダーをRESTテンプレートに渡すことです:

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

Spring-boot RestTemplateBuilder を使用できます

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

ドキュメント を参照してください

(SB 2.1.0より前は#basicAuthorizationでした)

61
Alex

(おそらく)spring-bootをインポートしない最も簡単な方法。

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

次のように、Spring Bootの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

17
Johnny Lim

Spring 5.1以降、HttpHeaders.setBasicAuthを使用できます

基本認証ヘッダーを作成します。

String username = "willie";
String password = ":p@ssword";
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。文字列-

10
YanivJ

次のようにインスタンス化する代わりに:

TestRestTemplate restTemplate = new TestRestTemplate();

このようにしてください:

TestRestTemplate restTemplate = new TestRestTemplate(user, password);

それは私のために働く、私はそれが役立つことを願っています!

6
Nidham