OAuth2 स्कोप के साथ काम करना

आपको Apigee Edge दस्तावेज़ दिख रहा है.
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है इस पेज पर जाएं Apigee X दस्तावेज़.
जानकारी

इस विषय में, Apigee Edge पर OAuth 2.0 स्कोप को इस्तेमाल करने के तरीके के बारे में बताया गया है.

OAuth2 स्कोप क्या है?

OAuth 2.0 के स्कोप की मदद से, किसी ऐक्सेस को दिए जाने वाले ऐक्सेस की सीमा को सीमित किया जा सकता है टोकन. उदाहरण के लिए, किसी क्लाइंट ऐप्लिकेशन को जारी किए गए ऐक्सेस टोकन को, READ और WRITE का ऐक्सेस दिया जा सकता है ऐक्सेस कर सकते हैं या रीड ऐक्सेस. किसी भी दायरे को लागू करने के लिए, अपने एपीआई लागू किए जा सकते हैं या आपके पसंद के दायरों का कॉम्बिनेशन. इसलिए, अगर किसी क्लाइंट को ऐसा टोकन मिलता है जिसमें रीड स्कोप मौजूद है और ऐसे एपीआई एंडपॉइंट को कॉल करने की कोशिश करता है जिसे डेटा में बदलाव करने के ऐक्सेस की ज़रूरत होती है, तो कॉल कनेक्ट नहीं हो पाएगा.

इस विषय में, हम बात करेंगे कि ऐक्सेस टोकन के लिए स्कोप कैसे असाइन किए जाते हैं. साथ ही, हम यह भी बताएंगे कि Apigee Edge OAuth 2.0 स्कोप लागू करता है. इस विषय को पढ़ने के बाद, स्कोप का इस्तेमाल इन कामों के लिए किया जा सकता है भरोसा.

ऐक्सेस टोकन के लिए दायरे कैसे असाइन किए जाते हैं?

जब Edge कोई ऐक्सेस टोकन जनरेट करता है, तो वह उस टोकन के लिए स्कोप असाइन कर सकता है. इसका तरीका समझने में ऐसा होने पर, आपको पहले इन Apigee Edge इकाइयों के बारे में जानकारी होनी चाहिए: एपीआई प्रॉडक्ट, डेवलपर, और डेवलपर ऐप्लिकेशन होते हैं. इसके बारे में जानने के लिए, पब्लिश करने के बारे में जानकारी देखें. हमारा सुझाव है कि आप: यह कॉन्टेंट देख सकते हैं.

ऐक्सेस टोकन, बिना किसी क्रम के दिखने वाले वर्णों की एक लंबी स्ट्रिंग होता है. Edge को API अनुरोधों की पुष्टि करने की अनुमति मिलती है. इसे आम तौर पर इस्तेमाल किए जाने वाले एपीआई के तौर पर उपयोगकर्ता नाम/पासवर्ड क्रेडेंशियल) तकनीकी रूप से, टोकन एक कुंजी है, जो मेटाडेटा जो ऐसा दिखता है:

{
  "issued_at" : "1416962591727",
  "application_name" : "0d3e1d41-a59f-4d74-957e-d4e3275d4781",
  "scope" : "A",
  "status" : "approved",
  "api_product_list" : "[scopecheck1-bs0cSuqS9y]",
  "expires_in" : "1799", //--in seconds
  "developer.email" : "scopecheck1-AdBmANhsag@apigee.com",
  "organization_id" : "0",
  "token_type" : "BearerToken",
  "client_id" : "eTtB7w5lvk3DnOZNGReBlvGvIAeAywun",
  "access_token" : "ODm47ris5AlEty8TDc1itwYPe5MW",
  "organization_name" : "wwitman",
  "refresh_token_expires_in" : "0", //--in seconds
  "refresh_count" : "0"
}

टोकन के मेटाडेटा में असली ऐक्सेस टोकन स्ट्रिंग, समयसीमा खत्म होने की जानकारी, टोकन से जुड़े डेवलपर ऐप्लिकेशन, डेवलपर, और प्रॉडक्ट की पहचान. आपको यह भी ध्यान दें कि मेटाडेटा में "दायरा" भी शामिल है.

टोकन को इसका स्कोप कैसे मिलता है?

दायरे को समझने के लिए सबसे ज़रूरी है कि यह याद रखें कि डेवलपर ऐप्लिकेशन में मौजूद हर प्रॉडक्ट, उसमें शून्य या उससे ज़्यादा स्कोप असाइन किए गए हों. ये दायरे तब असाइन किए जा सकते हैं, जब प्रॉडक्ट बनाई गई हैं या उन्हें बाद में जोड़ा जा सकता है. वे नामों की सूची के रूप में मौजूद होते हैं और "मेटाडेटा" इस्तेमाल किया जा सकता है.

जब डेवलपर ऐप्लिकेशन बनाया जाता है और उसमें प्रॉडक्ट जोड़े जाते हैं, तो Edge उस ऐप्लिकेशन में मौजूद सभी प्रॉडक्ट को देखता है वह डेवलपर ऐप्लिकेशन डाउनलोड कर सकता है और उन प्रॉडक्ट के सभी दायरों की सूची बना सकता है (ऐप्लिकेशन के मास्टर या ग्लोबल स्कोप सूची -- मान्य सभी दायरों का संयोजन).

जब कोई क्लाइंट ऐप्लिकेशन, Apigee Edge से ऐक्सेस टोकन का अनुरोध करता है, तो यह विकल्प के तौर पर यह तय कर सकता है कि कौनसा उन स्कोप के साथ जोड़े जा सकते हैं जिन्हें वह उस टोकन के साथ जोड़ना चाहेगा. उदाहरण के लिए, नीचे दिए गए अनुरोध में "A" दायरे के लिए. इसका मतलब है कि क्लाइंट अनुरोध करता है कि ऑथराइज़ेशन सर्वर (Edge) ऐसा ऐक्सेस टोकन जिसमें "A" स्कोप शामिल हो (ऐसे एपीआई को कॉल करने के लिए ऐप्लिकेशन को अनुमति देना जिनमें स्कोप "A" शामिल हो). ऐप्लिकेशन इस तरह का पोस्ट अनुरोध भेजता है:

curl -i -X POST -H Authorization: Basic Mg12YTk2UkEIyIBCrtro1QpIG -H content-type:application/x-www-form-urlencoded http://myorg-test.apigee.net/oauth/token?grant_type=client_credentials&scope=A

इस दिन क्या होगा?

जब Edge को यह अनुरोध मिलता है, तो उसे पता चलता है कि कौनसा ऐप्लिकेशन अनुरोध कर रहा है. साथ ही, उसे यह भी पता होता है कि उस डेवलपर ऐप्लिकेशन को जिसे क्लाइंट ने रजिस्टर किया है (क्लाइंट आईडी और क्लाइंट सीक्रेट कुंजियां, पुष्टि करने का बुनियादी हेडर). scope क्वेरी पैरामीटर शामिल होने की वजह से, Edge के लिए यह तय करें कि डेवलपर ऐप्लिकेशन से जुड़े किसी भी एपीआई प्रॉडक्ट में, "A" का स्कोप है या नहीं. अगर वे ऐसा करते हैं, तो "A" स्कोप वाला एक ऐक्सेस टोकन जनरेट किया जाता है. इसे समझने का एक और तरीका यह है कि स्कोप क्वेरी पैरामीटर एक तरह का फ़िल्टर है. अगर डेवलपर ऐप्लिकेशन "A, B, X" स्कोप को पहचानता है, और क्वेरी पैरामीटर "scope=X Y Z" के बारे में बताता है, इसके बाद सिर्फ़ "X" का दायरा तय करता है को असाइन किया जाएगा टोकन.

अगर क्लाइंट स्कोप पैरामीटर अटैच नहीं करता है, तो क्या होगा? इस मामले में, Edge एक टोकन जनरेट करता है इसमें ऐसे सभी दायरे शामिल हैं जिनकी पहचान डेवलपर ऐप्लिकेशन ने की है. यह समय है यह समझना ज़रूरी है कि डिफ़ॉल्ट तौर पर, ऐक्सेस टोकन वापस लौटाना होता है, जिसमें डेवलपर ऐप्लिकेशन में शामिल सभी प्रॉडक्ट के सभी दायरों को एक ही जगह पर दिखाया जा सकता है.

अगर डेवलपर ऐप्लिकेशन से जुड़ा कोई भी प्रॉडक्ट स्कोप के बारे में नहीं बताता है और टोकन में स्कोप शामिल है, एक स्कोप है, तो उस टोकन का इस्तेमाल करके किए गए कॉल फ़ेल हो जाएंगे.

मान लें कि कोई डेवलपर ऐप्लिकेशन इन दायरों की पहचान करता है: A B C D. यह ऐप्लिकेशन की मास्टर सूची है दायरे. ऐसा हो सकता है कि ऐप्लिकेशन में एक प्रॉडक्ट में स्कोप A और B और दूसरे प्रॉडक्ट में स्कोप C शामिल किया गया हो और D या कोई भी कॉम्बिनेशन इस्तेमाल किया जा सकता है. अगर क्लाइंट scope पैरामीटर की जानकारी नहीं देता (या अगर यह बिना वैल्यू वाले स्कोप पैरामीटर के बारे में बताता है) टोकन को चारों स्कोप के लिए अनुमति दी जाएगी: A, B, C, और डी॰ फिर से, टोकन को दायरों का एक सेट मिलता है जो मान्य किए गए सभी दायरों का योग होता है से डाउनलोड करें.

एक और मामले में, डिफ़ॉल्ट तौर पर यह तरीका इस्तेमाल होता है कि सभी स्कोप की पहचान की जाती है. इसके बाद, generateAccessToken नीति (Apigee Edge की नीति) ऐक्सेस टोकन जनरेट करता है) <Scope> एलिमेंट के बारे में नहीं बताता है. उदाहरण के लिए, यहां generateAccessToken नीति दी गई है, जिसमें <Scope> is बताया गया है. अगर वह <Scope> एलिमेंट मौजूद नहीं है (या अगर यह है मौजूद है, लेकिन खाली है), तो डिफ़ॉल्ट कार्रवाई लागू होती है.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<OAuthV2 async="false" continueOnError="false" enabled="true" name="OAuthV2-GenerateAccessToken">
    <DisplayName>OAuthV2 - Generate Access Token</DisplayName>
    <Attributes>
      <Attribute name='hello' ref='system.time' display='false'>value1</Attribute>
    </Attributes>
    <Scope>request.queryparam.scope</Scope> 
    <GrantType>request.formparam.grant_type</GrantType>
    <ExternalAuthorization>false</ExternalAuthorization>
    <Operation>GenerateAccessToken</Operation>
    <SupportedGrantTypes>
      <GrantType>client_credentials</GrantType>
    </SupportedGrantTypes>
  <GenerateResponse enabled="true"/>
</OAuthV2>

दायरे कैसे लागू किए जाते हैं?

सबसे पहले, यह याद रखें कि Apigee Edge पर, ऐक्सेस टोकन की पुष्टि OAuthV2 नीति की मदद से की जाती है (आम तौर पर, इन्हें प्रॉक्सी फ़्लो की शुरुआत में डाला जाता है). इस नीति में VerifyAccessToken कार्रवाई तय की गई. चलिए, इस नीति के बारे में जानते हैं:

<OAuthV2 async="false" continueOnError="false" enabled="true" name="OAuthV2-VerifyAccessTokenA">
    <DisplayName>Verify OAuth v2.0 Access Token</DisplayName>
    <ExternalAuthorization>false</ExternalAuthorization>
    <Operation>VerifyAccessToken</Operation>
    <Scope>A</Scope> <!-- Optional: space-separated list of scope names. -->
    <GenerateResponse enabled="true"/>
</OAuthV2>

<Scope> एलिमेंट को नोट करें. इसका इस्तेमाल यह बताने के लिए किया जाता है कि नीति का कौनसा दायरा स्वीकार करेगा.

इस उदाहरण में, ऐक्सेस टोकन में "A" स्कोप शामिल होने पर ही नीति लागू होगी. अगर यह &lt;Scope&gt; एलिमेंट हटा दिया जाता है या कोई वैल्यू नहीं होती, तो नीति ऐक्सेस टोकन.

अब दायरे के हिसाब से ऐक्सेस टोकन की पुष्टि की जा सकती है. इसके बाद, अपने एपीआई को इसके लिए डिज़ाइन किया जा सकता है खास दायरे लागू कर सकते हैं. ऐसा करने के लिए, स्कोप-अवेयर VerifyAccessToken की मदद से कस्टम फ़्लो डिज़ाइन करें जो उनसे जुड़ी नीतियों के बारे में बताती हैं.

मान लें कि आपके एपीआई में एंडपॉइंट /resourceA के लिए एक फ़्लो तय किया गया है:

<Flow name="resourceA">
            <Condition>(proxy.pathsuffix MatchesPath "/resourceA") and (request.verb = "GET")</Condition>
            <Description>Get a resource A</Description>
            <Request>
                <Step>
                    <Name>OAuthV2-VerifyAccessTokenA</Name>
                </Step>
            </Request>
            <Response>
                <Step>
                    <Name>AssignMessage-CreateResponse</Name>
                </Step>
            </Response>
        </Flow>

जब यह फ़्लो ट्रिगर होता है (पाथ में /resourceA के साथ अनुरोध आता है) सफ़िक्स), तो OAuthV2-VerifyAccessTokenA नीति को तुरंत कॉल कर दिया जाता है. यह नीति पुष्टि करती है कि ऐक्सेस टोकन मान्य है. साथ ही, यह पता लगाया जा रहा है कि टोकन किन दायरों के साथ काम करता है. अगर नीति नीचे दिए गए उदाहरण के तौर पर कॉन्फ़िगर किया गया है और <Scope>A</Scope> के साथ, नीति सिर्फ़ तब काम करेगी, जब अगर ऐक्सेस टोकन का स्कोप "A" है. ऐसा न करने पर, आपको गड़बड़ी दिखेगी.

<OAuthV2 async="false" continueOnError="false" enabled="true" name="OAuthV2-VerifyAccessTokenA">
    <DisplayName>Verify OAuth v2.0 Access Token</DisplayName>
    <ExternalAuthorization>false</ExternalAuthorization>
    <Operation>VerifyAccessToken</Operation>
    <Scope>A</Scope>
    <GenerateResponse enabled="true"/>
</OAuthV2>

खास जानकारी देने के लिए, एपीआई डेवलपर की ज़िम्मेदारी है कि वे अपने एपीआई में, स्कोप लागू करने के तरीके डिज़ाइन करें. ऐसा करने के लिए, वे खास स्कोप को मैनेज करने के लिए कस्टम फ़्लो बनाते हैं और VerifyAccessToken अटैच करते हैं नीतियां लागू की जा सकती हैं.

कोड के उदाहरण

आखिर में, आइए यह जानने के लिए कि टोकन कैसे मिलते हैं, कुछ एपीआई कॉल के उदाहरण देखते हैं दायरे और दायरे को लागू करने का तरीका.

डिफ़ॉल्ट केस

मान लें कि आपके पास प्रॉडक्ट वाला एक डेवलपर ऐप्लिकेशन है और उन प्रॉडक्ट को मिलाकर स्कोप हैं: A, B, और C. यह एपीआई कॉल, ऐक्सेस टोकन का अनुरोध करता है, लेकिन इसमें स्कोप वाली क्वेरी शामिल नहीं है पैरामीटर.

curl -X POST -H content-type:application/x-www-form-urlencoded http://wwitman-test.apigee.net/scopecheck1/token?grant_type=client_credentials

इस मामले में, जनरेट किए गए टोकन को स्कोप A, B, और C (डिफ़ॉल्ट व्यवहार) के लिए चुना जाएगा. कॉन्टेंट बनाने टोकन का मेटाडेटा कुछ ऐसा दिखेगा:

{
  "issued_at" : "1417016208588",
  "application_name" : "eb1a0333-5775-4116-9eb2-c36075ddc360",
  "scope" : "A B C",
  "status" : "approved",
  "api_product_list" : "[scopecheck1-yEgQbQqjRR]",
  "expires_in" : "1799", //--in seconds
  "developer.email" : "scopecheck1-yxiuHuZcDW@apigee.com",
  "organization_id" : "0",
  "token_type" : "BearerToken",
  "client_id" : "atGFvl3jgA0pJd05rXKHeNAC69naDmpW",
  "access_token" : "MveXpj4UYXol38thNoJYIa8fBGlI",
  "organization_name" : "wwitman",
  "refresh_token_expires_in" : "0", //--in seconds
  "refresh_count" : "0"
}

अब मान लें कि आपके पास एक ऐसा एपीआई एंडपॉइंट है जिसमें स्कोप "A" है (इसका मतलब है कि यह VerifyAccessToken है स्कोप "A" ज़रूरी है). VerifyAccessToken नीति यहां दी गई है:

<OAuthV2 async="false" continueOnError="false" enabled="true" name="OAuthV2-VerifyAccessTokenA">
    <DisplayName>Verify OAuth v2.0 Access Token</DisplayName>
    <ExternalAuthorization>false</ExternalAuthorization>
    <Operation>VerifyAccessToken</Operation>
    <Scope>A</Scope>
    <GenerateResponse enabled="true"/>
</OAuthV2>

यहां एक सैंपल कॉल टू और एंडपॉइंट दिया गया है, जो स्कोप A को लागू करता है:

curl -X GET -H Authorization: Bearer MveXpj4UYXol38thNoJYIa8fBGlI http://wwitman-test.apigee.net/scopecheck1/resourceA 

यह GET कॉल सफल होता है:

 {
   "hello" : "Tue, 25 Nov 2014 01:35:53 UTC"
 }

एंडपॉइंट को कॉल किए जाने पर, VerifyAccessToken नीति ट्रिगर होने की वजह से यह काम करता है स्कोप A की ज़रूरत होती है और ऐक्सेस टोकन को स्कोप A, B, और C दिया गया है -- यह डिफ़ॉल्ट व्यवहार.

फ़िल्टर करने वाला केस

मान लें कि आपके पास एक डेवलपर ऐप्लिकेशन है, जिसमें मौजूद प्रॉडक्ट के लिए स्कोप A, B, C, और X का इस्तेमाल किया गया है. आपने अनुरोध किया एक ऐक्सेस टोकन होता है और उसमें scope क्वेरी पैरामीटर शामिल किया जाता है, जैसे:

curl -i -X POST -H content-type:application/x-www-form-urlencoded 'http://myorg-test.apigee.net/oauth/token?grant_type=client_credentials&scope=A X'

इस मामले में, जनरेट किए गए टोकन को A और X स्कोप दिए जाएंगे, क्योंकि A और X, दोनों एक मान्य दायरे हैं. याद रखें कि डेवलपर ऐप्लिकेशन, स्कोप A, B, C, और X को पहचानता है. इस मामले में, एपीआई प्रॉडक्ट की सूची को इन दायरों के आधार पर फ़िल्टर किया जा रहा है. अगर किसी प्रॉडक्ट का स्कोप A या X है, तो आप एपीआई एंडपॉइंट को कॉन्फ़िगर कर सकते हैं, जो इन दायरों को लागू करेंगे. अगर किसी प्रॉडक्ट का स्कोप उपलब्ध नहीं है A या X (मान लें कि इसमें B,C, और Z है), तो A या X स्कोप लागू करने वाले एपीआई को कॉल नहीं किया जा सकता पर जाकर संपर्क फ़ॉर्म भरें.

एपीआई को नए टोकन से कॉल करने पर:

curl -X GET -H Authorization: Bearer Rkmqo2UkEIyIBCrtro1QpIG http://wwitman-test.apigee.net/scopecheck1/resourceX

ऐक्सेस टोकन की पुष्टि एपीआई प्रॉक्सी के ज़रिए की गई है. उदाहरण के लिए:

<OAuthV2 async="false" continueOnError="false" enabled="true" name="OAuthV2-VerifyAccessTokenX">
    <DisplayName>Verify OAuth v2.0 Access Token</DisplayName>
    <ExternalAuthorization>false</ExternalAuthorization>
    <Operation>VerifyAccessToken</Operation>
    <Scope>A X</Scope>
    <GenerateResponse enabled="true"/>
</OAuthV2>

जीईटी कॉल ट्रिगर सफल होता है और यह रिस्पॉन्स देता है. उदाहरण के लिए:

 {
   "hello" : "Tue, 25 Nov 2014 01:35:53 UTC"
 }
 

यह प्रोसेस पूरी हो जाती है, क्योंकि VerifyAccessToken नीति के लिए स्कोप A या X की ज़रूरत होती है. साथ ही, ऐक्सेस टोकन भी ज़रूरी होता है इसमें स्कोप A और X शामिल हैं. अगर <Scope> एलिमेंट को "B" पर सेट किया जाता, तो ज़रूर, तो यह कॉल विफल हो जाएगा.

खास जानकारी

यह समझना ज़रूरी है कि Apigee Edge, OAuth 2.0 स्कोप को कैसे मैनेज करता है. यहां सीखने के लिए ज़रूरी बातें अंक:

  • डेवलपर ऐप्लिकेशन "पहचानता है" इसके सभी प्रॉडक्ट के लिए तय किए गए सभी दायरों को एक साथ जोड़ सकता है.
  • जब कोई ऐप्लिकेशन किसी ऐक्सेस टोकन का अनुरोध करता है, तो उसे यह बताने का मौका मिलता है कि वह कौनसे स्कोप करेगा पसंद है. यह Apigee Edge (अनुमति देने वाला सर्वर) पर निर्भर करता है कि यह किस स्कोप का है असल में, ऐक्सेस टोकन इन बातों पर आधारित होगा: (a) अनुरोध किए गए दायरे और (b) जिनकी पहचान डेवलपर ऐप्लिकेशन से होती है.
  • अगर Apigee Edge को स्कोप (<Scope> एलिमेंट) की जांच करने के लिए कॉन्फ़िगर नहीं किया गया है VerifyAccessToken नीति में मौजूद नहीं है या यह खाली है), तो एपीआई कॉल इस तरह से पूरा होगा जब तक ऐक्सेस टोकन में एम्बेड किया गया स्कोप, किसी ऐसे स्कोप से मेल खाता है जिसे रजिस्टर किया गया डेवलपर ऐप्लिकेशन (ऐप्लिकेशन की "मास्टर" सूची के दायरों में से एक).
  • अगर किसी ऐक्सेस टोकन के साथ कोई स्कोप नहीं जुड़ा है, तो वह सिर्फ़ काम करेगा उन मामलों में जहां Edge दायरे पर ध्यान नहीं देता (<Scope> एलिमेंट मौजूद नहीं है) से लिंक किया गया है या यह खाली है).