स्प्रिंग restTemplate का उपयोग करके REST API के लिए मूल प्रमाणीकरण


86

मैं RestTemplate में पूरी तरह से नया हूं और मूल रूप से REST API में भी। मैं जीरा रीस्ट एपीआई के माध्यम से अपने आवेदन में कुछ डेटा पुनर्प्राप्त करना चाहता हूं, लेकिन 401 अनधिकृत रूप से वापस मिल रहा है। जीरा बाकी आपी प्रलेखन पर पाया और लेख लेकिन वास्तव में जावा में इसे फिर से लिखना नहीं जानता क्योंकि उदाहरण कर्ल के साथ कमांड लाइन का उपयोग करता है। मैं किसी भी सुझाव या सलाह की सराहना करता हूं कि कैसे फिर से लिखना है:

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

वसंत आराम टेम्पलेट का उपयोग करके जावा में। जहाँ ZnJlZDpmcmVk उपयोगकर्ता नाम का एक आधारभूत एन्कोडेड स्ट्रिंग है: पासवर्ड। आपका बहुत बहुत धन्यवाद।


यह भी देखें stackoverflow.com/questions/9376549/...
Raedwald

2
कर्ल बॉक्स से बाहर प्रमाणीकरण का समर्थन करता है, आपको बस इसे उपयोगकर्ता नाम और पासवर्ड बताने की आवश्यकता है curl -u fred:fred, क्लंकी मैनुअल हेडर की कोई आवश्यकता नहीं है। वही वसंत के लिए चला जाता है।
दिवानोव

जवाबों:


150

इस साइट पर उदाहरण से लिया गया , मुझे लगता है कि हेडर के मूल्य को भरने और हेडर को टेम्प्लेट में पास करने का यह सबसे स्वाभाविक तरीका होगा।

यह शीर्ष लेख में भरना है 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 वर्ग का उपयोग करना चाहते हैं: android.util.Base64 आयात करें; आप प्रतिस्थापित कर सकते हैं इसके साथ एक पंक्ति ऊपर: बाइट [] base64CredsBytes = Base64.encode (plainCredsBytes, Base64.DEFAULT);
साइमन

@ झदेशदेव हाय, यह मेरे लिए एक GET अनुरोध करने पर काम किया। हालांकि यह पोस्ट में 403 देने में विफल रहता है। क्या आप मेरी मदद कर सकते हैं?
स्टेफानो कैज़ोला

8
जावा 8 आप Base64.getMimeEncoder () का उपयोग कर सकते हैं। encodeToString ()
मैट Broekhuis

95

आप वसंत-बूट RestTemplateBuilder का उपयोग कर सकते हैं

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

प्रलेखन देखें

(एसबी 2.1.0 से पहले यह था #basicAuthorization)


1
आपने मेरा दिन बचाया। बहुत बहुत धन्यवाद।
riccardo.cardin

4
धन्यवाद! यह सबसे तेज और आसान तरीका है।
राजकिशन स्वामी

1
हाँ। यह सबसे तेज़ तरीका है। कोई अतिरिक्त निर्भरता की आवश्यकता नहीं है।
जननाथ

3
#basicAuthentication (स्ट्रिंग उपयोगकर्ता नाम, स्ट्रिंग पासवर्ड) के पक्ष में 2.1.0 के बाद से @deprecated
rjdkolb

2
यह एक अच्छा समाधान नहीं है क्योंकि यह प्रत्येक के माध्यम से भेजे गए प्रत्येक अनुरोध को एक प्राधिकरण शीर्षक जोड़ देगा RestTemplate
अटाकसियन

22

(शायद) वसंत-बूट आयात किए बिना सबसे आसान तरीका।

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

2
खबरदार कि इंटरसेप्टर्स का उपयोग करने का एक परिणाम है कि स्ट्रीमिंग अब काम नहीं करती है। यहाँ क्यों है: exchange()-> doExecute(), -> createRequest(), -> InterceptingHttpAccessor.getRequestFactory()(जब से RestTemplateफैली हुई है InterceptingHttpAccessor)। यदि इंटरसेप्टर होते हैं, तो getRequestFactory()एक रिटर्न देता है InterceptingClientHttpRequestFactory, जो InterceptingClientHttpRequestएस बनाता है । ये AbstractBufferingClientHttpRequest` का विस्तार करते हैं, जो इनपुट स्ट्रीम को बाइट [] (इंटरसेप्टर्स को बंद करने के लिए) में परिवर्तित करता है। तो, एक InputStream वास्तव में स्ट्रीम नहीं किया गया है।
मस्कनर

17

वसंत 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##BasicAuth-java.lang-tring-java.lang.String-tring


17

संदर्भ स्प्रिंग बूट का TestRestTemplateकार्यान्वयन निम्नानुसार है:

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 की ओर जाती है
जरमग्रेगरोक

15

बुनियादी 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();
}

यदि आप स्प्रिंग 5.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);

यह मेरे लिए काम करता है, मुझे आशा है कि यह मदद करता है!


TestRestTemplate वसंत बूट को 1.3.x में अपग्रेड करने के बाद काम करने के लिए प्रतीत नहीं होता है
विवेक सेठी

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.