Spring restTemplate kullanarak REST API için temel kimlik doğrulama


86

RestTemplate'te ve temelde REST API'lerinde de tamamen yeniyim. Uygulamamdaki bazı verileri Jira REST API aracılığıyla geri almak istiyorum, ancak 401 Yetkisiz geri dönüyorum. Jira rest api belgeleri hakkında bir makale bulundu, ancak örnek curl ile komut satırı yolunu kullandığından, bunu java'ya nasıl yeniden yazacağınızı gerçekten bilmiyorum. Nasıl yeniden yazılacağı konusunda herhangi bir öneri veya tavsiyeyi takdir ediyorum:

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

yay dinlenme şablonunu kullanarak java içine. ZnJlZDpmcmVk'nin base64 kodlu bir kullanıcı adı dizesi olduğu yerde: password. Çok teşekkür ederim.



2
curl, kutudan çıkar çıkmaz kimlik doğrulamayı destekler, sadece kullanıcı adını ve parolayı söylemeniz curl -u fred:fredgerekir, hantal manuel başlıklara gerek yoktur. Aynı şey Bahar için de geçerli.
divanov

Yanıtlar:


150

Bu sitedeki örnekten yola çıkarak , bence bunu yapmanın en doğal yolu, başlık değerini doldurarak ve başlığı şablona geçirerek.

Bu, başlığı doldurmak içindir 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);

Ve bu, başlığı REST şablonuna iletmektir:

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

1
Teşekkürler - bu benim için çalıştı. Org.apache.commons.codec.binary.Base64 sınıfını kullanmak istemiyorsanız ve bunun yerine android Base64 sınıfını kullanmak istiyorsanız şunu belirtmeliyim: import android.util.Base64;, bununla bir satır yukarıda: byte [] base64CredsBytes = Base64.encode (plainCredsBytes, Base64.DEFAULT);
Simon

@jhadesdev Merhaba, bir GET isteği gerçekleştirirken bu benim için çalıştı. Postadayken 403 veremese de. Bana yardımcı olabilir misiniz?
Stefano Cazzola

8
java 8 Base64.getMimeEncoder () kullanabilirsiniz. encodeToString ()
Matt Broekhuis

95

Yaylı RestTemplateBuilder'ı kullanabilirsiniz

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

Belgelere bakın

(SB 2.1.0'dan önce idi #basicAuthorization)


1
Günümü kurtardın. Çok teşekkürler.
riccardo.cardin

4
Teşekkürler! Bu en hızlı ve en kolay yoldur.
Rajkishan Swami

1
Evet. bu en hızlı yoldur. Ek bağımlılık gerekmez.
Janath

3
2.1.0'dan beri #basicAuthentication (Dize kullanıcı adı, Dize şifresi) lehine @deprecated
rjdkolb

2
Gönderilen her bir isteğe bir yetkilendirme başlığı ekleyeceği için iyi bir çözüm değildir RestTemplate.
attacomsian

22

(belki) yaylı önyüklemeyi içe aktarmadan en kolay yol.

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

2
Önleyiciler kullanmanın, akışın artık çalışmamasına neden olacağına dikkat edin. Nedeni şu: exchange()-> doExecute(), -> createRequest(), -> InterceptingHttpAccessor.getRequestFactory()( RestTemplategenişlediğinden beri InterceptingHttpAccessor). Önleyiciler varsa , s'yi oluşturan getRequestFactory()bir döndürür . Bunlar, giriş akışını bir bayta [] dönüştüren (önleyicilere devretmek için) AbstractBufferingClientHttpRequest`'i genişletir. Dolayısıyla, bir InputStream gerçekte akışa alınmaz. InterceptingClientHttpRequestFactoryInterceptingClientHttpRequest
mconner

17

İlkbahar 5.1 itibariyle kullanabilirsiniz HttpHeaders.setBasicAuth

Temel Yetkilendirme başlığı oluşturun:

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

Başlıkları RestTemplate'e geçirin:

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

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


17

Referans Spring Boot TestRestTemplateuygulaması aşağıdaki gibidir:

https://github.com/spring-projects/spring-boot/blob/v1.2.2.RELEASE/spring-boot/src/main/java/org/springframework/boot/test/TestRestTemplate.java

Özellikle aşağıdaki şekilde addAuthentication () yöntemine bakın:

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

Benzer şekilde, RestTemplatekolayca kendiniz de yapabilirsiniz

TestRestTemplateaşağıdaki gibi miras yoluyla :

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


ilk bağlantı 404'e çıkar
Zarremgregarrok

15

Temel HTTP kimlik doğrulamasını RestTemplate.

1. Tek bir istek için

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.1veya üstünü kullanıyorsanız , artık yetkilendirme başlığını manuel olarak ayarlamanıza gerek yoktur. Kullanım headers.setBasicAuth()yerine yöntemi:

// create headers
HttpHeaders headers = new HttpHeaders();
headers.setBasicAuth("username", "password");

2. Bir grup talep için

@Service
public class RestService {

    private final RestTemplate restTemplate;

    public RestService(RestTemplateBuilder restTemplateBuilder) {
        this.restTemplate = restTemplateBuilder
                .basicAuthentication("username", "password")
                .build();
    }

   // use `restTemplate` instance here
}

3. Her istek için

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

Umut ediyorum bu yardım eder!


En iyi cevap. Her biri nazik olduğu için.
Rishi

6

Aşağıdaki gibi örneklemek yerine:

TestRestTemplate restTemplate = new TestRestTemplate();

Bunu şöyle yap:

TestRestTemplate restTemplate = new TestRestTemplate(user, password);

Benim için çalışıyor, umarım yardımcı olur!


TestRestTemplate, yaylı önyüklemeyi 1.3.x'e yükselttikten sonra çalışmıyor gibi görünüyor
Vivek Sethi

1
Bunun, kodu serbest bırakmayan birim testleri için kullanılması gerekmiyor mu?
David Bradley

0

setBasicAuthKimlik bilgilerini tanımlamak için kullanın

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

Ardından, tercih ettiğiniz gibi istek oluşturun.

Misal:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.