SpringrestTemplateを使用したRESTAPIの基本認証


83

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

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

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



2
curlは、すぐに使用できる認証をサポートしています。ユーザー名とパスワードを指定するだけでcurl -u fred:fred、不格好な手動ヘッダーは必要ありません。同じことが春にも当てはまります。
divanov 2014

回答:


148

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

これはヘッダーに記入すること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();

1
ありがとう-これは私のために働いた。org.apache.commons.codec.binary.Base64クラスを使用せず、代わりにandroid Base64クラスを使用したい場合は、import android.util.Base64;を置き換えることができることを、指摘する必要がありました。上記の1行:byte [] base64CredsBytes = Base64.encode(plainCredsBytes、Base64.DEFAULT);
サイモン

@jhadesdevこんにちは、これはGETリクエストを実行するときに私のために働きました。ポストにいるときは403を与えることに失敗しますが。手伝って頂けますか?
Stefano Cazzola 2015

7
java 8 Base64.getMimeEncoder()。encodeToString()を使用できます
Matt Broekhuis 2017年

92

Spring - BootRestTemplateBuilderを使用できます

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

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

(SB 2.1.0より前は#basicAuthorization


1
あなたは私の日を救った。どうもありがとう。
riccardo.cardin 2017年

4
ありがとう!これは最も速くて簡単な方法です。
RajkishanSwami18年

1
はい。これが最速の方法です。追加の依存関係は必要ありません。
Janath 2018

3
@ 2.1.0以降、#basicAuthentication(String username、String password)を
優先して非推奨

1
を介して送信されるすべてのリクエストに認証ヘッダーが追加されるため、これは適切なソリューションではありませんRestTemplate
attacomsian

22

(たぶん)spring-bootをインポートしない最も簡単な方法。

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

2
インターセプターを使用すると、ストリーミングが機能しなくなることに注意してください。理由は次のとおりですexchange()。-> doExecute()、-> createRequest()、-> InterceptingHttpAccessor.getRequestFactory()RestTemplate拡張されているためInterceptingHttpAccessor)。インターセプターがある場合は、をgetRequestFactory()返し、 sInterceptingClientHttpRequestFactoryを作成しますInterceptingClientHttpRequest。これらはAbstractBufferingClientHttpRequest`を拡張し、入力ストリームをbyte []に​​変換します(インターセプターに渡すため)。したがって、InputStreamは実際にはストリーミングされません。
mconner

17

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.String-


17

TestRestTemplate次のようにSpringBootの実装を参照してください。

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


404への最初のリンクリード
Zarremgregarrok

14

基本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();
}

Spring5.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();
}

お役に立てば幸いです。


ベストアンサー。それぞれが親切です。
リシ

6

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

TestRestTemplate restTemplate = new TestRestTemplate();

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

TestRestTemplate restTemplate = new TestRestTemplate(user, password);

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


Spring Bootを1.3.xにアップグレードした後、TestRestTemplateが機能していないようです
Vivek Sethi

1
これはリリースコードではなく単体テストに使用されることになっているのではありませんか?
デビッド・ブラッドリー

0

setBasicAuth資格情報の定義に使用

HttpHeaders headers = new HttpHeaders();
headers.setBasicAuth("myUsername", myPassword);

次に、必要に応じてリクエストを作成します。

例:

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.