2013-01-03 14 views
15

मैं अपने नए आरईएसटी सर्वर और हमारे मौजूदा क्लाइंट ऐप के बीच क्लाइंट क्रेडेंशियल्स प्रवाह को समझने और कार्यान्वित करने की कोशिश कर रहा हूं। मैंने वसंत-सुरक्षा OAuth2 को this की तरह सेटअप किया है। अब तक मेरी समझ से, अपने सर्वर अब निम्न अनुरोध का समर्थन करना चाहिए:ओएथ 2 क्लाइंट क्रेडेंशियल प्रवाह को समझना

$ curl -X -v -d 'client_id=the_client&client_secret=secret&grant_type=client_credentials' -X POST "http://localhost:9090/oauth/token" 

लेकिन मैं

InsufficientAuthenticationException: There is no client authentication 

Principal (वसंत-सुरक्षा कोड) किया जा रहा है null यहाँ की वजह से मिलता है:

@FrameworkEndpoint 
@RequestMapping(value = "/oauth/token") 
public class TokenEndpoint extends AbstractEndpoint { 

    @RequestMapping 
    public ResponseEntity<OAuth2AccessToken> getAccessToken(Principal principal, 
      @RequestParam("grant_type") String grantType, @RequestParam Map<String, String> parameters) { 

     if (!(principal instanceof Authentication)) { 
      throw new InsufficientAuthenticationException(

तो ऐसा लगता है, मुझे सर्वर सर्वर के विरुद्ध प्रमाणित करने की आवश्यकता है। लेकिन यह नहीं है जो मैं करना चाहता हूं। मैं चाहता हूं कि मेरे दो सर्वर एक साझा रहस्य का उपयोग करके एक-दूसरे से बात करें। OAuth प्रदाता सर्वर को अनुरोध पर (विश्वसनीय) क्लाइंट सर्वर तक पहुंच टोकन प्रदान करना चाहिए ताकि क्लाइंट सर्वर सर्वर पर सभी REST संसाधनों तक पहुंचने के लिए उस टोकन का उपयोग कर सके। यह बाहरी पहुंच से आरईएसटी संसाधनों की रक्षा करनी चाहिए।

बाद में मैं चयनित संसाधनों को किसी तृतीय पक्ष को प्रदान करना चाहता हूं और अंत में सर्वर-से-सर्वर संचार के लिए कुछ बेहतर अनाज सुरक्षा भी लागू करना चाहता हूं। लेकिन अभी के लिए मुझे बाहरी एक्सेस से आरईएसटी सर्वर की रक्षा करने की आवश्यकता है।

ऐसा लगता है कि मुझे पूरे ग्राहक प्रमाण-पत्र प्रवाह या वसंत-सुरक्षा के अनुप्रयोग के बारे में कुछ गलतफहमी हो सकती है, इसलिए कोई स्पष्टीकरण की सराहना की जाएगी।

उत्तर

18

आप अपने क्लाइंट को प्रमाणीकरण सर्वर पर प्रमाणित नहीं कर रहे हैं।

आप कुछ इस तरह करने की जरूरत है:

curl --user the_client:secret --data "grant_type=client_credentials" http://localhost:9090/oauth/token 

इस प्राधिकरण सर्वर से ग्राहक के सत्यापन जाता है और फिर grant_type और अन्य पैरामीटर को निर्दिष्ट। यह ओथ ग्राहक विवरण द्वारा निर्धारित दायरे के साथ 'बीयरर' प्रकार का एक एक्सेस टोकन लौटाएगा। एक बार आपके पास टोकन हो जाने पर, आप प्राधिकरण शीर्षलेख सेट करके अपने संरक्षित संसाधनों तक पहुंच सकते हैं:

curl -H "Authorization: Bearer <accessToken>" <resourceUrl> 
+0

आपके उत्तर के लिए धन्यवाद। तो विचार की मेरी ट्रेन मूल रूप से सही है? क्लाइंट क्रेडेंशियल प्रवाह के लिए मैं क्लाइंट क्रेडेंशियल और अनुदान प्रकार के साथ टोकन का अनुरोध करता हूं और फिर सुरक्षित संसाधनों तक पहुंचने के लिए उस टोकन का उपयोग करता हूं? मुझे लगता है कि मेरे पास बस एक सेटअप त्रुटि है, क्योंकि स्पार्कलर उदाहरण प्रोजेक्ट का उपयोग करते हुए मैंने ऊपर उल्लिखित कॉल काम किया है .. – Pete

+0

मुझे लगता है कि आप सही रास्ते पर हैं। क्लाइंट एक विशेष अनुदान प्रकार का उपयोग कर पहले टोकन का अनुरोध करता है। फिर संरक्षित संसाधन तक पहुंचने पर आप ऑथ हेडर में टोकन पास करते हैं। मैंने संसाधन का उपयोग करने के उदाहरण के साथ अपना जवाब अपडेट किया है। – kldavis4

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