Basisauthentifizierung für die REST-API mit spring restTemplate

Lesezeit: 5 Minuten

Ich bin völlig neu in RestTemplate und im Grunde auch in den REST-APIs. Ich möchte einige Daten in meiner Anwendung über die Jira REST API abrufen, bekomme aber 401 Unauthorized zurück. Gefunden und Artikel auf Jira-Rest-API-Dokumentation aber ich weiß nicht wirklich, wie ich das in Java umschreiben soll, da das Beispiel die Befehlszeile mit curl verwendet. Ich würde mich über Vorschläge oder Ratschläge zum Umschreiben freuen:

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

in Java mit Federrestvorlage. Wobei ZnJlZDpmcmVk eine Base64-codierte Zeichenfolge von Benutzername:Passwort ist. Vielen Dank.

  • Siehe auch stackoverflow.com/questions/9376549/…

    – Raedwald

    30. Juli 2014 um 11:19 Uhr

  • curl unterstützt die Authentifizierung von Anfang an, Sie müssen ihm nur Benutzername und Passwort mitteilen curl -u fred:fred, keine Notwendigkeit für klobige manuelle Header. Dasselbe gilt für den Frühling.

    – diwanow

    18. September 2014 um 8:28 Uhr

Benutzer-Avatar
Winkeluniversität

Entnommen aus der Beispiel auf dieser Seiteich denke, dies wäre der natürlichste Weg, den Header-Wert auszufüllen und den Header an die Vorlage zu übergeben.

Dies dient zum Ausfüllen der Kopfzeile 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);

Und dies dient dazu, den Header an die REST-Vorlage zu übergeben:

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

  • Danke – das hat bei mir funktioniert. Ich musste darauf hinweisen, dass Sie, wenn Sie die Klasse org.apache.commons.codec.binary.Base64 nicht verwenden möchten und stattdessen die Klasse android Base64 verwenden möchten: import android.util.Base64;, die ersetzen können eine Zeile darüber damit: byte[] base64CredsBytes = Base64.encode (plainCredsBytes, Base64.DEFAULT);

    – Simon

    17. Mai 2015 um 19:09 Uhr


  • @jhadesdev Hallo, das hat bei mir funktioniert, als ich eine GET-Anfrage durchgeführt habe. Obwohl es bei der Post keine 403 gibt. Können Sie mir helfen?

    – Stefano Cazzola

    2. Juli 2015 um 22:16 Uhr

  • Java 8 können Sie Base64.getMimeEncoder().encodeToString() verwenden

    – Matt Broekhuis

    2. Januar 2017 um 19:10 Uhr

Benutzer-Avatar
Alex

Sie können Spring-Boot verwenden RestTemplateBuilder

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

Sehen Dokumentation

(vor SB 2.1.0 war es #basicAuthorization)

  • Du hast meinen Tag gerettet. Vielen Dank.

    – riccardo.cardin

    13. November 2017 um 13:31 Uhr

  • Vielen Dank! Dies ist der schnellste und einfachste Weg.

    – Rajkishan Swami

    18. Januar 2018 um 13:35 Uhr

  • Ja. das geht am schnellsten. Es sind keine zusätzlichen Abhängigkeiten erforderlich.

    – Janat

    6. Juni 2018 um 11:07 Uhr

  • Es ist keine gute Lösung, da es jeder gesendeten Anfrage einen Autorisierungsheader hinzufügen würde RestTemplate.

    – attacomsisch

    21. September 2019 um 12:45 Uhr

Es gibt mehrere Möglichkeiten, die grundlegende HTTP-Authentifizierung zum hinzuzufügen RestTemplate.

1. Für eine einzelne Anfrage

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

Wenn Sie Spring verwenden 5.1 oder höher ist es nicht mehr erforderlich, den Berechtigungsheader manuell zu setzen. Benutzen headers.setBasicAuth() Methode stattdessen:

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

2. Für eine Gruppe von Anfragen

@Service
public class RestService {

    private final RestTemplate restTemplate;

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

   // use `restTemplate` instance here
}

3. Für jede Anfrage

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

Ich hoffe, es hilft!

  • Beste Antwort. Jeder für seine Art.

    – Rischi

    6. Januar 2020 um 8:23 Uhr

Ab Spring 5.1 können Sie verwenden HttpHeaders.setBasicAuth

Kopfzeile für Basisautorisierung erstellen:

String username = "willie";
String password = ":[email protected]";
HttpHeaders headers = new HttpHeaders();
headers.setBasicAuth(username, password);
...other headers goes here...

Übergeben Sie die Header an das RestTemplate:

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

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

(vielleicht) der einfachste Weg, ohne Spring-Boot zu importieren.

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

  • Beachten Sie, dass die Verwendung von Abfangjägern dazu führt, dass das Streaming nicht mehr funktioniert. Hier ist der Grund: exchange() -> doExecute()-> createRequest()-> InterceptingHttpAccessor.getRequestFactory() (seit RestTemplate erweitert InterceptingHttpAccessor). Wenn es Abfangjäger gibt, getRequestFactory() gibt ein zurück InterceptingClientHttpRequestFactorydas schafft InterceptingClientHttpRequests. Diese erweitern AbstractBufferingClientHttpRequest`, das den Eingabestrom in ein Byte konvertiert[] (zur Übergabe an die Abfangjäger). Ein InputStream wird also nicht wirklich gestreamt.

    – mconner

    12. April 2019 um 19:27 Uhr

Siehe Spring Boot TestRestTemplate Umsetzung wie folgt:

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

Siehe insbesondere die Methode addAuthentication() wie folgt:

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

Ebenso können Sie Ihre eigenen machen RestTemplate leicht

durch Erbschaft wie TestRestTemplate wie folgt:

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

  • Beachten Sie, dass die Verwendung von Abfangjägern dazu führt, dass das Streaming nicht mehr funktioniert. Hier ist der Grund: exchange() -> doExecute()-> createRequest()-> InterceptingHttpAccessor.getRequestFactory() (seit RestTemplate erweitert InterceptingHttpAccessor). Wenn es Abfangjäger gibt, getRequestFactory() gibt ein zurück InterceptingClientHttpRequestFactorydas schafft InterceptingClientHttpRequests. Diese erweitern AbstractBufferingClientHttpRequest`, das den Eingabestrom in ein Byte konvertiert[] (zur Übergabe an die Abfangjäger). Ein InputStream wird also nicht wirklich gestreamt.

    – mconner

    12. April 2019 um 19:27 Uhr

Benutzer-Avatar
Geoffrey Wiseman

Anstatt wie folgt zu instanziieren:

TestRestTemplate restTemplate = new TestRestTemplate();

Mach es einfach so:

TestRestTemplate restTemplate = new TestRestTemplate(user, password);

Es funktioniert für mich, ich hoffe es hilft!

  • TestRestTemplate scheint nach dem Upgrade von Spring Boot auf 1.3.x nicht zu funktionieren

    – Vivek Sethi

    10. Mai 2016 um 7:13 Uhr

  • Sollte dies nicht für Komponententests verwendet werden, nicht für die Freigabe von Code?

    – David Bradley

    28. August 2019 um 11:59 Uhr

1014390cookie-checkBasisauthentifizierung für die REST-API mit spring restTemplate

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy