9

मैं दो स्वतंत्र सेवाओं, व्यावसायिक सामग्री के लिए एक और स्प्रिंग OAuth 2स्प्रिंग OAuth: प्राधिकरण सर्वर बैकएंड

का उपयोग कर के उन्हें व्यापार-सेवा और OAuth सेवा कहते हैं उपयोगकर्ता प्रमाणीकरण के लिए एक विकसित करना चाहते हैं के साथ संसाधन सर्वर।

अब यदि अनुरोध प्रमाणित नहीं है तो मैं व्यापार सेवा प्रतिनिधि को ओथ-सेवा में भेजना चाहता हूं। क्लाइंट एप्लिकेशन (एक एंड्रॉइड ऐप) को ओथ-सर्विस के बारे में पहले से नहीं जानना चाहिए, इसे केवल गैर-प्रमाणीकृत अनुरोध के लिए 302 HTTP रीडायरेक्ट के साथ बिजनेस-सर्विस द्वारा ही सौंप दिया जाना चाहिए। सटीक होने के लिए, मैं चाहता हूं कि मेरा एपीआई लैंडिंग पृष्ठ http://businessservice.com/login पर एक लिंक प्रदान करे और जब मेरा क्लाइंट ऐप इस लिंक का पालन करने का निर्णय लेता है, तो यह ओथ-सेवा पर रीडायरेक्ट हो जाता है।

यदि मैं @EnableOAuth2Resource के साथ बिजनेस-सर्विस को एनोटेट करता हूं, तो इसके सभी संसाधन 401 लौटने पर सुरक्षित होते हैं जब मैं उन्हें एक्सेस टोकन के बिना घुमाता हूं। अब तक सब ठीक है। अगर मैं इस तरह की टोकन एक्सेस प्रदान करता हूं:

curl -v http://localhost:8667/resource/ -H "Authorization: Bearer $TOKEN" 

मैं संसाधन तक पहुंच सकता हूं। फिर भी अच्छा।

हालांकि अगर मैं ओएथ सेवा के पुनर्निर्देशन को सक्षम करने के लिए @EnableOAuth2Sso के साथ बिजनेस-सर्विस को एनोटेट करता हूं, तो यह एक्सेस टोकन (उपरोक्त के समान कर्ल) के साथ संसाधनों तक पहुंचने की क्षमता खो देता है, यह केवल लॉगिन के लिए 302 देता है पेज http://localhost:8667/login

अगर मैं दोनों एनोटेशन का उपयोग, @ EnableOAuth2Resource हमेशा "जीत" के लिए, प्रमाणीकरण काम करता है के रूप में लगता है, लेकिन बुला http://localhost:8667/login रिटर्न एक 404.

तो सही तरीके से एक संसाधन सर्वर है कि प्रतिनिधियों को बनाने के लिए क्या है गैर-प्रमाणित कॉल के लिए ऑथ सर्वर पर?

उत्तर

4

घंटों के आसपास प्रयास करने के बाद अब मुझे एक समाधान मिला।

व्यवसाय सर्वर (संसाधन सर्वर) अब इस प्रकार दिखता है:

@SpringBootApplication 
@EnableOAuth2Sso 
@EnableOAuth2Resource 
public class BusinessService { 

    public static void main(final String[] args) { 
     final ConfigurableApplicationContext context = SpringApplication.run(BusinessService.class, args); 
    } 

} 

दो विन्यास, एसएसओ के लिए एक साथ:

@Configuration 
public class OAuth2SsoConfiguration extends OAuth2SsoConfigurerAdapter { 

    @Override 
    public void match(final RequestMatchers matchers) { 
     matchers.antMatchers("/"); 
    } 

    @Override 
    public void configure(final HttpSecurity http) throws Exception { 
     http.authorizeRequests().anyRequest().permitAll(); 
    } 

} 

और संसाधन के लिए एक:

@Configuration 
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter { 

    @Override 
    public void configure(final HttpSecurity http) throws Exception { 
     http.requestMatchers().antMatchers("/resource/**").and().authorizeRequests().anyRequest().authenticated().antMatchers("/").permitAll(); 

    } 

} 



निम्नलिखित में यह परिणाम:

curl -v http://localhost:8667/ 

रिटर्न

HTTP/1.1 200 OK 
{"links":[{"rel":"login","href":"http://localhost:8667/login"}]} 



curl -v http://localhost:8667/resource/ 

रिटर्न

HTTP/1.1 401 Unauthorized 
{"error":"unauthorized","error_description":"Full authentication is required to access this resource"} 



curl -v http://localhost:8667/login 

रिटर्न

HTTP/1.1 302 Found 
Location: http://localhost:8666/user/oauth/authorize?client_id=clientId&redirect_uri=http%3A%2F%2Flocalhost%3A8667%2Flogin&response_type=code&state=YmmNO9 

तो अपने व्यवसाय servie एक संसाधन सर्वर सभी व्यापार संसाधनों के लिए एक 401 लौटने के रूप में साथ सुरक्षित है। सेवा की जड़ सभी क्लाइंट के लिए लागू होती है ताकि वे लॉगिन संबंध खोज सकें और यदि वे इस संबंध का पालन करते हैं, तो उन्हें प्राधिकरण सर्वर

+1

पर रीडायरेक्ट किया जा सकता है, क्या आप उपयोगकर्ता के बाद संसाधन सर्वर में उपयोगकर्ता जानकारी कैसे प्राप्त कर सकते हैं oauth2 द्वारा प्रमाणित है? – Kane

+0

@ केन, यह बहुत देर हो चुकी है, लेकिन दूसरों की मदद कर सकती है। आप एंडपॉइंट्स में निम्नलिखित पैरामीटर का उपयोग कर सकते हैं: @RequestHeader (value = "प्रमाणीकरण") स्ट्रिंग प्रमाणीकरण हैडर, प्रिंसिपल वर्तमान उपयोगकर्ता – Sourabh

संबंधित मुद्दे