सर्वर से सर्वर ऐप्लिकेशन के लिए OAuth 2.0 का उपयोग करना

संग्रह की मदद से व्यवस्थित रहें अपनी प्राथमिकताओं के आधार पर, कॉन्टेंट को सेव करें और कैटगरी में बांटें.
ये बाकी पर मौजूद है. बी इनकी जानकारी: फ़ैन के बारे में कोई जानकारी कोई ऐसे रिनी के बारे में कोई जानकारी कोई ऐसे डेटा और फ़ैन की कोई जानकारी कोई फ़ैन कैसे होस्ट किए जाते हैं; कैसे कोई वीडियो कोई काम कोई कारोबार मौजूद होते हैं; कंपनी के वीडियो और फ़ैन की कोई मौजूद कोई कैसे कोई काम ठीक कैसे: कर काम करने कैसे कोई काम ठीक नहीं है. डिलीवर किए गए चैनल और कंपनी कोई काम शुरू करने के लिए ये कौन दिखें : कौन वीडियो और काम शुरू हो सकते हैं? जो चैनल और कौन शुरू हो सकते हैं? जो चैनल और कौन शुरू और ये जो मौजूद हैं? ये चैनल? जो चैनल और कौन शुरू और ये हैं? ये चैनल इनकी कौन बैक चैनल हैं? ये कंपनी चैनल के जो कंपनी और काम की कौन कौन हैं? ये चैनल इनकी कोई काम : फ़ैन कंपनी की कौन चैनल और चैनल चैनल और कंपनी चैनल और कंपनी की और कंपनी की कैसे ये वो चैनल और कौन हैं? ये चैनल? ये चैनल? ये कंपनी? ये कौन कंपनी इनकी कोई कंपनी है?? ये चैनल? इनकी कौन काम करने हैं? ज़्यादा जानकारी के लिए, Google Cloud Platform के दस्तावेज़ में पुष्टि करने की खास जानकारी देखें.

Google OAuth 2.0 सिस्टम, सर्वर-टू-सर्वर इंटरैक्शन के साथ काम करता है. जैसे, वेब ऐप्लिकेशन और Google की सेवा के बीच होने वाले इंटरैक्शन. इस स्थिति के लिए, आपके पास पहले से मौजूद सेवा खाता होना ज़रूरी है. निजी खाते के बजाय, किसी दूसरे उपयोगकर्ता के खाते से जुड़ा ऐप्लिकेशन, आपके खाते से जुड़ा होना चाहिए. आपका ऐप्लिकेशन, सेवा खाते की ओर से Google API को कॉल करता है, ताकि उपयोगकर्ता सीधे तौर पर शामिल न हों. इस स्थिति को कभी-कभी & "दो-टांगों वाला OAuth,&कोटेशन; या &कोट्स 22.&कोटेशन कहा जाता है; (इससे मिलते-जुलते शब्द ' & तीन पैरों वाले OAuth&कोटेशन' का मतलब उन स्थितियों से है जिनमें आपका ऐप्लिकेशन असली उपयोगकर्ताओं की तरफ़ से Google API का इस्तेमाल करता है और कभी-कभी उपयोगकर्ता की सहमति लेना भी ज़रूरी होता है.)

आम तौर पर, जब कोई ऐप्लिकेशन उपयोगकर्ता के डेटा के बजाय अपने डेटा के साथ काम करने के लिए Google API का इस्तेमाल करता है, तो वह सेवा खाते का इस्तेमाल करता है. उदाहरण के लिए, अगर ऐप्लिकेशन में डेटा परसिस्टेंट के लिए Google Cloud Datastore का इस्तेमाल किया जाता है, तो वह Google Cloud Datastore API पर अपने कॉल की पुष्टि करने के लिए सेवा खाते का इस्तेमाल करेगा.

Google Workspace डोमेन एडमिन, डोमेन के सभी खातों के लिए सेवा खाते का ऐक्सेस दे सकते हैं, ताकि डोमेन के उपयोगकर्ताओं का डेटा ऐक्सेस किया जा सके.

यह दस्तावेज़ बताता है कि कोई ऐप्लिकेशन किस तरह Google API क्लाइंट लाइब्रेरी (सुझाया गया) या एचटीटीपी का इस्तेमाल करके सर्वर-टू-सर्वर OAuth 2.0 फ़्लो को पूरा कर सकता है.

खास जानकारी

सर्वर-टू-सर्वर इंटरैक्शन में मदद करने के लिए, पहले में अपने प्रोजेक्ट के लिए सेवा खाता बनाएं. अगर आप अपने Google Workspace खाते के उपयोगकर्ताओं का डेटा ऐक्सेस करना चाहते हैं, तो सेवा खाते का ऐक्सेस पूरे डोमेन पर दें.

इसके बाद, आपका ऐप्लिकेशन OAuth 2.0 की पुष्टि करने वाले सर्वर से ऐक्सेस टोकन का अनुरोध करने के लिए, सेवा खाते और #39; के क्रेडेंशियल का इस्तेमाल करके, अनुमति वाले एपीआई कॉल करने की तैयारी कर रहा है.

आखिर में, आपका ऐप्लिकेशन Google API को कॉल करने के लिए, ऐक्सेस टोकन का इस्तेमाल कर सकता है.

सेवा खाता बनाया जा रहा है

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

अगर आपका ऐप्लिकेशन Google App Engine पर चलता है, तो प्रोजेक्ट बनाने के बाद आपका सेवा खाता अपने-आप सेट अप हो जाता है.

अगर आपका ऐप्लिकेशन Google Compute Engine पर चलता है, तो प्रोजेक्ट बनाते समय एक सेवा खाता अपने-आप ज़्यादा जानकारी के लिए, सेवा खातों का इस्तेमाल करने के लिए इंस्टेंस तैयार करना देखें.

अगर आपका ऐप्लिकेशन Google App Engine या Google Compute Engine पर नहीं चलता, तो आपको ये क्रेडेंशियल में पाने होंगे. सेवा खाते के क्रेडेंशियल जनरेट करने या पहले से जनरेट किए गए सार्वजनिक क्रेडेंशियल देखने के लिए, यह तरीका अपनाएं:

सबसे पहले, एक सेवा खाता बनाएँ:

  1. खोलें Service accounts page
  2. If prompted, select a project, or create a new one.
  3. क्लिक करें सेवा खाता बनाएँ।
  4. सेवा खाते के विवरण के अंतर्गत, टाइप एक नाम, आईडी, और सेवा खाते के लिए विवरण, तो बनाएं और जारी रखें पर क्लिक करें।
  5. वैकल्पिक: के तहत अनुदान परियोजना के लिए इस सेवा खाते का उपयोग, IAM भूमिकाओं का चयन सेवा खाते में देने के लिए।
  6. जारी रखें पर क्लिक करें।
  7. वैकल्पिक: इस सेवा खाते में अनुदान के तहत उन का उपयोग, उपयोगकर्ताओं या समूहों का उपयोग करें और सेवा खाते का प्रबंधन करने की अनुमति है जोड़ें।
  8. पूर्ण क्लिक करें।
  9. क्लिक करें कुंजी बनाएं, फिर बनाएँ क्लिक करें।

इसके बाद, एक सेवा खाता कुंजी बनाएं:

  1. आपके द्वारा बनाए गए सेवा खाते के लिए ईमेल पते पर क्लिक करें।
  2. कुंजी टैब पर क्लिक करें।
  3. कुंजी जोड़ें ड्रॉप-डाउन सूची में, नई कुंजी बनाएं चुनें।
  4. बनाएँ क्लिक करें।

आपकी नई सार्वजनिक/निजी कुंजी जोड़ी जनरेट की जाती है और आपकी मशीन पर डाउनलोड की जाती है; यह निजी कुंजी की एकमात्र प्रति के रूप में कार्य करता है। आप इसे सुरक्षित रूप से संग्रहीत करने के लिए जिम्मेदार हैं। यदि आप इस कुंजी युग्म को खो देते हैं, तो आपको एक नया कुंजी युग्म बनाना होगा।

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

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

पूरे डोमेन के लिए सेवा खाते का ऐक्सेस देना

अगर आपके पास Google Workspace खाता है, तो संगठन का एडमिन किसी ऐप्लिकेशन को Google Workspace डोमेन में मौजूद उपयोगकर्ताओं की ओर से उपयोगकर्ता का डेटा ऐक्सेस करने की अनुमति दे सकता है. उदाहरण के लिए, एक ऐप्लिकेशन जो Google Workspace डोमेन के सभी उपयोगकर्ताओं के कैलेंडर में इवेंट जोड़ने के लिए Google Calendar API का इस्तेमाल करता है, वह उपयोगकर्ताओं की ओर से Google Calendar API का इस्तेमाल करने के लिए, सेवा खाते का इस्तेमाल करेगा. किसी डोमेन में उपयोगकर्ताओं की ओर से डेटा को ऐक्सेस करने के लिए, सेवा खाते को अनुमति देना. इसे कभी-कभी सेवा के खाते के तौर पर &कोटेशन के तौर पर इस्तेमाल किया जाता है.

पूरे डोमेन के हिसाब से किसी सेवा खाते को ऐक्सेस करने के लिए, Google Workspace डोमेन के सुपर एडमिन को यह तरीका अपनाना होगा:

  1. अपने Google Workspace डोमेन के Admin console में जाकर, मुख्य मेन्यू > Security > ऐक्सेस और डेटा कंट्रोल > एपीआई कंट्रोल पर जाएं.
  2. पूरे डोमेन पर सौंपना पैनल में, पूरे डोमेन पर सौंपना प्रबंधित करें चुनें.
  3. नया जोड़ें पर क्लिक करें.
  4. Client-ID फ़ील्ड में, सेवा खाता का नाम डालें ##39;s Client-ID. आप Service accounts pageमें अपना सेवा खाता का क्लाइंट आईडी देख सकते हैं.
  5. OAuth के दायरे (कॉमा लगाकर अलग किए गए) फ़ील्ड में, उन दायरों की सूची डालें जिनका ऐक्सेस आपके ऐप्लिकेशन को देना है. उदाहरण के लिए, अगर आपके ऐप्लिकेशन को Google Drive API और Google Calendar API का पूरा ऐक्सेस चाहिए, तो https://www.googleapis.com/auth/drive, https://www.googleapis.com/auth/calendar का नाम डालें.
  6. अनुमति दें पर क्लिक करें.

अब आपके ऐप्लिकेशन को आपके डोमेन में उपयोगकर्ताओं के रूप में API (एपीआई) कॉल करने की अनुमति है; (उपयोगकर्ताओं को &कोटेशन करें). जब आप अनुमति वाले एपीआई कॉल करने की तैयारी करते हैं, तो आप उपयोगकर्ता को किसी दूसरे के नाम पर काम करने के लिए कहते हैं.

अनुमति वाले एपीआई कॉल के लिए तैयारी करना

Java

API Consoleसे क्लाइंट ईमेल पता और निजी कुंजी मिल जाने के बाद, सेवा खाते से GoogleCredential ऑब्जेक्ट बनाने के लिए, Java के लिए Google API क्लाइंट लाइब्रेरी का इस्तेमाल करें. साथ ही, जिन दायरों का इस्तेमाल करने के लिए आपके ऐप्लिकेशन को ऐक्सेस की ज़रूरत है. उदाहरण के लिए:

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.services.sqladmin.SQLAdminScopes;

// ...

GoogleCredential credential = GoogleCredential.fromStream(new FileInputStream("MyProject-1234.json"))
    .createScoped(Collections.singleton(SQLAdminScopes.SQLSERVICE_ADMIN));

अगर आप Google Cloud Platform पर कोई ऐप्लिकेशन बना रहे हैं, तो इसके बजाय आप ऐप्लिकेशन के डिफ़ॉल्ट क्रेडेंशियल का इस्तेमाल कर सकते हैं. इससे यह प्रोसेस आसान हो जाता है.

पूरे डोमेन के लिए डेटा देने की अनुमति देना

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

GoogleCredential credential = GoogleCredential.fromStream(new FileInputStream("MyProject-1234.json"))
    .createScoped(Collections.singleton(SQLAdminScopes.SQLSERVICE_ADMIN))
    .createDelegated("user@example.com");

अपने ऐप्लिकेशन में Google API को कॉल करने के लिए, GoogleCredential ऑब्जेक्ट का इस्तेमाल करें.

Python

API Consoleसे क्लाइंट का ईमेल पता और निजी कुंजी पाने के बाद, नीचे दिए गए चरणों को पूरा करने के लिए, Python के लिए Google API क्लाइंट लाइब्रेरी का इस्तेमाल करें:

  1. सेवा खाते के क्रेडेंशियल और उन दायरों की जानकारी से Credentials ऑब्जेक्ट बनाएं, जिनके लिए आपके ऐप्लिकेशन को ऐक्सेस की ज़रूरत है. उदाहरण के लिए:
    from google.oauth2 import service_account
    
    SCOPES = ['https://www.googleapis.com/auth/sqlservice.admin']
    SERVICE_ACCOUNT_FILE = '/path/to/service.json'
    
    credentials = service_account.Credentials.from_service_account_file(
            SERVICE_ACCOUNT_FILE, scopes=SCOPES)

    अगर आप Google Cloud Platform पर कोई ऐप्लिकेशन बना रहे हैं, तो इसके बजाय आप ऐप्लिकेशन के डिफ़ॉल्ट क्रेडेंशियल का इस्तेमाल कर सकते हैं. इससे यह प्रोसेस आसान हो जाता है.

  2. पूरे डोमेन के लिए डेटा देने की अनुमति देना

    अगर आपने सेवा खाते को पूरे डोमेन का ऐक्सेस दिया है और आप किसी उपयोगकर्ता खाते के नाम पर काम करना चाहते हैं, तो मौजूदा ServiceAccountCredentials ऑब्जेक्ट के with_subject तरीके का इस्तेमाल करें. उदाहरण के लिए:

    delegated_credentials = credentials.with_subject('user@example.org')

अपने ऐप्लिकेशन में Google API को कॉल करने के लिए क्रेडेंशियल ऑब्जेक्ट का इस्तेमाल करें.

एचटीटीपी/REST

API Consoleसे क्लाइंट आईडी और निजी कुंजी मिलने के बाद, आपके आवेदन को ये चरण पूरे करने होंगे:

  1. ऐसा JSON वेब टोकन (JWT, उच्चारण, और &jot;jot&quat;) बनाएं जिसमें हेडर, दावा सेट, और हस्ताक्षर शामिल हो.
  2. Google OAuth 2.0 ऑथराइज़ेशन सर्वर से ऐक्सेस टोकन के लिए अनुरोध करें.
  3. ऑथराइज़ेशन सर्वर से मिलने वाले JSON के रिस्पॉन्स को मैनेज करें.

आगे दिए गए सेक्शन में इन चरणों को पूरा करने का तरीका बताया गया है.

अगर जवाब में ऐक्सेस टोकन शामिल है, तो आप Google API को कॉल करने के लिए, ऐक्सेस टोकन का इस्तेमाल कर सकते हैं. (अगर जवाब में ऐक्सेस टोकन शामिल नहीं है, तो हो सकता है कि आपका JWT और टोकन अनुरोध सही तरीके से न बनाया गया हो. यह भी हो सकता है कि सेवा खाते के पास अनुरोध किए गए दायरे को ऐक्सेस करने की अनुमति न हो.)

जब ऐक्सेस टोकन समयसीमा खत्म हो जाती है, तो आपका ऐप्लिकेशन एक और JWT जनरेट करता है, उस पर हस्ताक्षर करता है, और एक अन्य ऐक्सेस टोकन का अनुरोध करता है.

आपका सर्वर ऐप्लिकेशन, JWT ऑथराइज़ेशन सर्वर से टोकन का अनुरोध करने के लिए, JWT का इस्तेमाल करता है. इसके बाद, टोकन का इस्तेमाल करके, Google API एंडपॉइंट को कॉल करता है. किसी भी असली उपयोगकर्ता को शामिल नहीं किया जाता है.

इस सेक्शन के बाकी हिस्सों में, JWT बनाने, JWT पर हस्ताक्षर करने, ऐक्सेस टोकन के लिए अनुरोध करने, और रिस्पॉन्स को मैनेज करने के बारे में बताया गया है.

JWT बनाना

JWT में तीन हिस्से होते हैं: हेडर, दावा सेट, और हस्ताक्षर. हेडर और दावे का सेट, JSON ऑब्जेक्ट है. ये JSON ऑब्जेक्ट, UTF-8 बाइट में क्रम से लगाए गए हैं. इसके बाद, इन्हें Base64url एन्कोडिंग के हिसाब से एन्कोड किया जाता है. यह एन्कोडिंग, बार-बार होने वाले कोड में बदलने की वजह से, कोड में बदलाव करने की प्रतिरोधक क्षमता की सुरक्षा करती है. हेडर, दावे का सेट, और हस्ताक्षर को यूआरएल (.) वर्ण में जोड़ दिया जाता है.

JWT में यह डेटा शामिल होता है:

{Base64url encoded header}.{Base64url encoded claim set}.{Base64url encoded signature}

हस्ताक्षर के लिए बेस स्ट्रिंग नीचे दी गई है:

{Base64url encoded header}.{Base64url encoded claim set}
JWT हेडर बनाना

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

सेवा खाते, आरएसए SHA-256 एल्गोरिदम और JWT टोकन फ़ॉर्मैट पर निर्भर करते हैं. इस वजह से, हेडर को JSON के तौर पर इस तरह दिखाया जाता है:

{"alg":"RS256","typ":"JWT"}

इस तरह के Base64url को इस तरह दिखाया जा सकता है:

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9
JWT दावा सेट बनाना

JWT दावा सेट में JWT के बारे में जानकारी दी जाती है. इस जानकारी में अनुरोध किए गए अधिकार (स्कोप), टोकन का टारगेट, जारी करने वाला बैंक, टोकन जारी किए जाने का समय, और टोकन का जीवनकाल शामिल होता है. ज़्यादातर फ़ील्ड ज़रूरी हैं. JWT हेडर की तरह, JWT दावा भी एक JSON ऑब्जेक्ट है और इसका इस्तेमाल सिग्नेचर की गिनती में किया जाता है.

ज़रूरी दावे

JWT दावा सेट में ज़रूरी दावे नीचे दिखाए गए हैं. ये दावों के सेट में किसी भी क्रम में दिख सकते हैं.

नाम ब्यौरा
iss सेवा खाते का ईमेल पता.
scope ऐप्लिकेशन ने जिन अनुमतियों का अनुरोध किया है उनके बीच में खाली जगह देकर, इनकी सूची दी गई है.
aud दावे के लक्षित लक्ष्य का वर्णनकर्ता. ऐक्सेस टोकन का अनुरोध करते समय, यह वैल्यू हमेशा https://oauth2.googleapis.com/token होती है.
exp दावे की समयसीमा खत्म होने का समय, जिसे 1 जनवरी, 1970 को 00:00:00 यूटीसी से सेकंड के तौर पर बताया गया. जारी किए गए समय के बाद, इस मान में ज़्यादा से ज़्यादा एक घंटा लग सकता है.
iat दावा जारी किए जाने के समय की जानकारी 1 जनवरी, 1970 को 00:00:00 यूटीसी से सेकंड के तौर पर दी जाती है.

JWT दावा सेट में ज़रूरी फ़ील्ड का JSON दिखाना नीचे दिखाया गया है:

{
  "iss": "761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com",
  "scope": "https://www.googleapis.com/auth/devstorage.read_only",
  "aud": "https://oauth2.googleapis.com/token",
  "exp": 1328554385,
  "iat": 1328550785
}
अतिरिक्त दावे

कुछ एंटरप्राइज़ मामलों में, कोई ऐप्लिकेशन संगठन के किसी खास उपयोगकर्ता की ओर से कार्रवाई करने के लिए, पूरे डोमेन पर सौंपना इस्तेमाल कर सकता है. इस तरह के पहचान चुराने के लिए अनुमति मिलना ज़रूरी है. यह अनुमति तब ही दी जानी चाहिए, जब कोई ऐप्लिकेशन किसी उपयोगकर्ता की पहचान चुराकर काम कर सकता हो. साथ ही, आम तौर पर इसे कोई सुपर एडमिन मैनेज करता हो. ज़्यादा जानकारी के लिए, पूरे डोमेन पर सौंपना वाले एपीआई ऐक्सेस को कंट्रोल करें देखें.

किसी ऐप्लिकेशन को किसी संसाधन का ऐक्सेस देने वाला ऐक्सेस टोकन पाने के लिए, JWT दावा में मौजूद उपयोगकर्ता के ईमेल पते को sub फ़ील्ड की वैल्यू के तौर पर शामिल करें.

नाम ब्यौरा
sub उस उपयोगकर्ता का ईमेल पता जिसके लिए ऐप्लिकेशन, ऐक्सेस किए गए ऐक्सेस का अनुरोध कर रहा है.

अगर किसी ऐप्लिकेशन को उपयोगकर्ता की पहचान चुराने की अनुमति नहीं है, तो ऐक्सेस टोकन के अनुरोध का जवाब, जिसमें sub फ़ील्ड शामिल होता है, गड़बड़ी होगी.

JWT दावा सेट का एक उदाहरण नीचे दिया गया है जिसमें sub फ़ील्ड शामिल है:

{
  "iss": "761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com",
  "sub": "some.user@example.com",
  "scope": "https://www.googleapis.com/auth/prediction",
  "aud": "https://oauth2.googleapis.com/token",
  "exp": 1328554385,
  "iat": 1328550785
}
JWT दावा सेट को एन्कोड करना

JWT हेडर की तरह, JWT दावा सेट को कोड में बदलने के लिए, UTF-8 और Base64url-safe का इस्तेमाल किया जाना चाहिए. नीचे, JWT दावा सेट के JSON को दिखाने का उदाहरण दिया गया है:

{
  "iss": "761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com",
  "scope": "https://www.googleapis.com/auth/prediction",
  "aud": "https://oauth2.googleapis.com/token",
  "exp": 1328554385,
  "iat": 1328550785
}
सिग्नेचर की गिनती करना

JSON वेब सिग्नेचर (JWS) वह निर्देश है जो जेडब्ल्यूटी के लिए हस्ताक्षर जनरेट करने के तरीकों के बारे में बताता है. हस्ताक्षर के लिए इनपुट नीचे दिए गए कॉन्टेंट की बाइट कैटगरी है:

{Base64url encoded header}.{Base64url encoded claim set}

हस्ताक्षर की गणना करते समय, JWT हेडर में साइनिंग एल्गोरिदम का इस्तेमाल किया जाना चाहिए. SHA-256 हैशिंग एल्गोरिदम का इस्तेमाल करके, सिर्फ़ Google OAuth 2.0 ऑथराइज़ेशन सर्वर पर काम करने वाला साइनिंग एल्गोरिदम आरएसए है. JWT हेडर में alg फ़ील्ड में, इसे RS256 के तौर पर दिखाया जाता है.

Google API Consoleसे मिली निजी कुंजी के साथ, SHA256withRSA (जिसे SHASSA- {5/}1-V1_5-SIGN के साथ SHA-256 हैश फ़ंक्शन के तौर पर भी जाना जाता है) का इस्तेमाल करके, इनपुट के UTF-8 पर हस्ताक्षर करें. आउटपुट एक बाइट श्रेणी होगी.

इसके बाद, सिग्नेचर Base64url कोड में बदला गया होना चाहिए. हेडर, दावे का सेट, और हस्ताक्षर एक विराम (.) वर्ण के साथ जोड़ दिए जाते हैं. इससे, JWT नतीजा मिलता है. यह नीचे दी गई जानकारी होनी चाहिए (साफ़ तौर पर जानकारी देने के लिए, लाइन ब्रेक जोड़े गए):

{Base64url encoded header}.
{Base64url encoded claim set}.
{Base64url encoded signature}

नीचे Base64url एन्कोडिंग के पहले JWT का एक उदाहरण दिया गया है:

{"alg":"RS256","typ":"JWT"}.
{
"iss":"761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com",
"scope":"https://www.googleapis.com/auth/prediction",
"aud":"https://oauth2.googleapis.com/token",
"exp":1328554385,
"iat":1328550785
}.
[signature bytes]

नीचे, JWT का एक उदाहरण दिया गया है, जिस पर हस्ताक्षर किए गए हैं और वह ट्रांसमिशन के लिए तैयार है:

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI3NjEzMjY3OTgwNjktcjVtbGpsbG4xcmQ0bHJiaGc3NWVmZ2lncDM2bTc4ajVAZGV2ZWxvcGVyLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzY29wZSI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvcHJlZGljdGlvbiIsImF1ZCI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL29hdXRoMi92NC90b2tlbiIsImV4cCI6MTMyODU1NDM4NSwiaWF0IjoxMzI4NTUwNzg1fQ.UFUt59SUM2_AW4cRU8Y0BYVQsNTo4n7AFsNrqOpYiICDu37vVt-tw38UKzjmUKtcRsLLjrR3gFW3dNDMx_pL9DVjgVHDdYirtrCekUHOYoa1CMR66nxep5q5cBQ4y4u2kIgSvChCTc9pmLLNoIem-ruCecAJYgI9Ks7pTnW1gkOKs0x3YpiLpzplVHAkkHztaXiJdtpBcY1OXyo6jTQCa3Lk2Q3va1dPkh_d--GU2M5flgd8xNBPYw4vxyt0mP59XZlHMpztZt0soSgObf7G3GXArreF_6tpbFsS3z2t5zkEiHuWJXpzcYr5zWTRPDEHsejeBSG8EgpLDce2380ROQ

ऐक्सेस टोकन का अनुरोध करना

हस्ताक्षर किए गए JWT को जनरेट करने के बाद, ऐप्लिकेशन इसका इस्तेमाल ऐक्सेस टोकन के लिए अनुरोध करने के लिए कर सकता है. यह ऐक्सेस टोकन अनुरोध एक एचटीटीपीएस अनुरोध POST है और मुख्य हिस्सा कोड में बदला गया है. यूआरएल नीचे दिखाया गया है:

https://oauth2.googleapis.com/token

HTTPS POST अनुरोध में इन पैरामीटर की ज़रूरत है:

नाम ब्यौरा
grant_type नीचे दी गई स्ट्रिंग का इस्तेमाल करें, यूआरएल को अपनी ज़रूरत के हिसाब से कोड में बदलें: urn:ietf:params:oauth:grant-type:jwt-bearer
assertion JWT, जिसमें हस्ताक्षर भी शामिल है.

नीचे एचटीटीपीएस टोकन का एक रॉ डंप दिया गया है POST ऐक्सेस टोकन के लिए इस्तेमाल किए गए अनुरोध का इस्तेमाल किया गया है:

POST /token HTTP/1.1
Host: oauth2.googleapis.com
Content-Type: application/x-www-form-urlencoded

grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI3NjEzMjY3OTgwNjktcjVtbGpsbG4xcmQ0bHJiaGc3NWVmZ2lncDM2bTc4ajVAZGV2ZWxvcGVyLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzY29wZSI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvcHJlZGljdGlvbiIsImF1ZCI6Imh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL29hdXRoMi90b2tlbiIsImV4cCI6MTMyODU3MzM4MSwiaWF0IjoxMzI4NTY5NzgxfQ.ixOUGehweEVX_UKXv5BbbwVEdcz6AYS-6uQV6fGorGKrHf3LIJnyREw9evE-gs2bmMaQI5_UbabvI4k-mQE4kBqtmSpTzxYBL1TCd7Kv5nTZoUC1CmwmWCFqT9RE6D7XSgPUh_jF1qskLa2w0rxMSjwruNKbysgRNctZPln7cqQ

नीचे वही अनुरोध दिया गया है जो curl का इस्तेमाल कर रहा है:

curl -d 'grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI3NjEzMjY3OTgwNjktcjVtbGpsbG4xcmQ0bHJiaGc3NWVmZ2lncDM2bTc4ajVAZGV2ZWxvcGVyLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzY29wZSI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvcHJlZGljdGlvbiIsImF1ZCI6Imh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL29hdXRoMi90b2tlbiIsImV4cCI6MTMyODU3MzM4MSwiaWF0IjoxMzI4NTY5NzgxfQ.RZVpzWygMLuL-n3GwjW1_yhQhrqDacyvaXkuf8HcJl8EtXYjGjMaW5oiM5cgAaIorrqgYlp4DPF_GuncFqg9uDZrx7pMmCZ_yHfxhSCXru3gbXrZvAIicNQZMFxrEEn4REVuq7DjkTMyCMGCY1dpMa8aWfTQFt3Eh7smLchaZsU
' https://oauth2.googleapis.com/token

रिस्पॉन्स मैनेज करना

अगर JWT और ऐक्सेस टोकन के लिए अनुरोध सही तरीके से बनाया गया है और सेवा खाते को कार्रवाई करने की अनुमति है, तो ऑथराइज़ेशन सर्वर से JSON रिस्पॉन्स में ऐक्सेस टोकन शामिल होता है. नीचे उदाहरण के तौर पर जवाब दिया गया है:

{
  "access_token": "1/8xbJqaOZXSUZbHLl5EOtu1pxz3fmmetKx9W8CV4t79M",
  "scope": "https://www.googleapis.com/auth/prediction"
  "token_type": "Bearer",
  "expires_in": 3600
}

ऐक्सेस वैल्यू का इस्तेमाल, expires_in वैल्यू की तय की गई अवधि के दौरान फिर से किया जा सकता है.

Google API कॉलिंग

Java

Google API को कॉल करने के लिए, GoogleCredential ऑब्जेक्ट का इस्तेमाल करें. इसके लिए, यह तरीका अपनाएं:

  1. एपीआई के लिए सेवा ऑब्जेक्ट बनाएं, जिसे GoogleCredential ऑब्जेक्ट का इस्तेमाल करके कॉल करना है. उदाहरण के लिए:
    SQLAdmin sqladmin =
        new SQLAdmin.Builder(httpTransport, JSON_FACTORY, credential).build();
  2. एपीआई सेवा के लिए अनुरोध करें. इसके लिए, सेवा ऑब्जेक्ट के दिए गए इंटरफ़ेस का इस्तेमाल करें. उदाहरण के लिए, रोमांचक-example-123 प्रोजेक्ट में Cloud SQL डेटाबेस के इंस्टेंस को सूची में जोड़ने के लिए:
    SQLAdmin.Instances.List instances =
        sqladmin.instances().list("exciting-example-123").execute();

Python

यह तरीका अपनाकर, Google API को कॉल करने के लिए, अनुमति वाले Credentials ऑब्जेक्ट का इस्तेमाल करें:

  1. उस एपीआई के लिए सेवा ऑब्जेक्ट बनाएं जिसे आप कॉल करना चाहते हैं. आप build फ़ंक्शन को कॉल करके, सेवा का ऑब्जेक्ट बनाएं. इसके लिए, एपीआई के नाम और वर्शन और अनुमति वाले Credentials ऑब्जेक्ट का इस्तेमाल करें. उदाहरण के लिए, Cloud SQL एडमिन एपीआई के वर्शन 1 beta3 को कॉल करने के लिए:
    import googleapiclient.discovery
    
    sqladmin = googleapiclient.discovery.build('sqladmin', 'v1beta3', credentials=credentials)
  2. एपीआई सेवा के लिए अनुरोध करें. इसके लिए, सेवा ऑब्जेक्ट के दिए गए इंटरफ़ेस का इस्तेमाल करें. उदाहरण के लिए, रोमांचक-example-123 प्रोजेक्ट में Cloud SQL डेटाबेस के इंस्टेंस को सूची में जोड़ने के लिए:
    response = sqladmin.instances().list(project='exciting-example-123').execute()

एचटीटीपी/REST

आपके ऐप्लिकेशन को ऐक्सेस टोकन मिलने के बाद, आप टोकन का इस्तेमाल करके Google एपीआई को कॉल कर सकते हैं. इसके लिए, आपको दिए गए सेवा खाते या Google खाते की ओर से एपीआई का इस्तेमाल करने की अनुमति देनी होगी. ऐसा करने के लिए, ऐक्सेस क्वेरी में एपीआई का ऐक्सेस टोकन शामिल करें. इसके लिए, access_token क्वेरी पैरामीटर या Authorization एचटीटीपी हेडर Bearer वैल्यू शामिल करें. हो सके, तो एचटीटीपी हेडर को प्राथमिकता दी जाती है, क्योंकि क्वेरी लॉग आम तौर पर सर्वर लॉग में दिखते हैं. ज़्यादातर मामलों में, Google API पर अपने कॉल सेट अप करने के लिए, क्लाइंट लाइब्रेरी का इस्तेमाल किया जा सकता है. उदाहरण के लिए, Drive Files API पर कॉल करते समय.

आप OAuth 2.0 Playground पर सभी Google API आज़मा सकते हैं और उनके दायरे देख सकते हैं.

एचटीटीपी GET के उदाहरण

Authorization: Bearer एचटीटीपी हेडर का इस्तेमाल करके drive.files एंडपॉइंट (Drive Files API) को कॉल करने पर यह जैसा दिख सकता है. ध्यान दें कि आपको अपना खुद का ऐक्सेस टोकन देना होगा:

GET /drive/v2/files HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer access_token

यहां, access_token क्वेरी स्ट्रिंग पैरामीटर का इस्तेमाल करके, पुष्टि किए हुए उपयोगकर्ता के लिए उसी एपीआई को कॉल किया गया है:

GET https://www.googleapis.com/drive/v2/files?access_token=access_token

curl के उदाहरण

आप curl कमांड लाइन ऐप्लिकेशन की मदद से, इन निर्देशों की जांच कर सकते हैं. यहां एक उदाहरण दिया गया है, जो एचटीटीपी हेडर विकल्प का इस्तेमाल करता है (इसका इस्तेमाल करना बेहतर होगा):

curl -H "Authorization: Bearer access_token" https://www.googleapis.com/drive/v2/files

या फिर, क्वेरी स्ट्रिंग पैरामीटर का विकल्प:

curl https://www.googleapis.com/drive/v2/files?access_token=access_token

ऐक्सेस टोकन की समयसीमा कब खत्म होती है

Google OAuth 2.0 ऑथराइज़ेशन सर्वर से जारी किए गए ऐक्सेस टोकन की समयसीमा, expires_in की वैल्यू के बाद खत्म हो जाती है. जब ऐक्सेस टोकन की समयसीमा खत्म हो जाती है, तो ऐप्लिकेशन को एक और JWT जनरेट करना होगा. उस टोकन पर हस्ताक्षर करके, दूसरे ऐक्सेस टोकन का अनुरोध करना होगा.

JWT गड़बड़ी कोड

error फ़ील्ड error_description फ़ील्ड लिंक समस्या को कैसे हल करें
unauthorized_client Unauthorized client or scope in request. अगर आप पूरे डोमेन के डेटा का ऐक्सेस देने की कोशिश कर रहे हैं, तो सेवा खाते को उपयोगकर्ता के डोमेन के Admin console से अनुमति नहीं मिली है.

पक्का करें कि सेवा खाता, sub दावे (फ़ील्ड) में उपयोगकर्ता के लिए Admin console के पूरे डोमेन पर सौंपना पेज में अनुमति दिया गया है.

आम तौर पर, कुछ मिनट लगते हैं. हालांकि, इसे आपके Google खाते में सभी उपयोगकर्ताओं तक पहुंचने में 24 घंटे लग सकते हैं.

unauthorized_client Client is unauthorized to retrieve access tokens using this method, or client not authorized for any of the scopes requested. Admin console में, क्लाइंट आईडी (न्यूमेरिक) के बजाय क्लाइंट खाते का इस्तेमाल करके, सेवा खाते को अनुमति दी गई. Admin console के पूरे डोमेन पर सौंपना पेज में, क्लाइंट को हटाएं और उसे न्यूमेरिक आईडी के साथ फिर से जोड़ें.
access_denied (कोई भी मान) {0/}

पक्का करें कि सेवा खाते को sub दावे (फ़ील्ड) के उपयोगकर्ता के लिए, Admin console के पूरे डोमेन पर सौंपना वाले पेज पर अनुमति दी गई है. साथ ही, इसमें आपके JWT के scope दावे में शामिल सभी दायरे शामिल हैं.

आम तौर पर, कुछ मिनट लगते हैं. हालांकि, इसे आपके Google खाते में सभी उपयोगकर्ताओं तक पहुंचने में 24 घंटे लग सकते हैं.

invalid_grant Not a valid email. उपयोगकर्ता मौजूद नहीं है#39;मौजूद नहीं है. पक्का करें कि sub दावे (फ़ील्ड) में दिया गया ईमेल पता सही हो.
invalid_grant

Invalid JWT: Token must be a short-lived token (60 minutes) and in a reasonable timeframe. Check your 'iat' and 'exp' values and use a clock with skew to account for clock differences between systems.

आम तौर पर, स्थानीय सिस्टम का समय सही नहीं होता है. ऐसा भी हो सकता है कि exp वैल्यू, आने वाले समय में iat वैल्यू से 65 मिनट से ज़्यादा या exp वैल्यू iat वैल्यू से कम हो.

पक्का करें कि सिस्टम की वह घड़ी जहां JWT जनरेट किया गया है वह सही है. अगर ज़रूरी हो, तो अपना समय, Google NTP के साथ सिंक करें.

invalid_grant Invalid JWT Signature.

JWT का दावा, उस निजी कुंजी से साइन किया गया है जो क्लाइंट के खाते से जुड़े सेवा खाते से नहीं जुड़ी है. इस कुंजी को मिटा दिया गया है, बंद कर दिया गया है या इसकी समयसीमा खत्म हो गई है.

इसके अलावा, JWT दावा गलत तरीके से कोड में बदला जा सकता है - यह Base64 कोड में होना चाहिए और इसमें नई लाइनें या पैडिंग के बराबर चिह्न नहीं होने चाहिए.

JWT दावा सेट को डिकोड करें और दावे की पुष्टि करने वाले कुंजी की पुष्टि सेवा खाते से करें.

यह पक्का करने के लिए कि JWT सही तरीके से जनरेट हुई है, Google की ओर से दी गई OAuth लाइब्रेरी इस्तेमाल करने की कोशिश करें.

invalid_scope Invalid OAuth scope or ID token audience provided. किसी भी दायरे का अनुरोध नहीं किया गया था (दायरे की खाली सूची) या अनुरोध किए गए दायरों में से कोई एक मौजूद नहीं है (#39;t) (यानी, अमान्य).

यह पक्का करें कि JWT का scope दावा (फ़ील्ड) भर गया है. साथ ही, इसमें इस्तेमाल किए जाने वाले उन एपीआई के स्कोप की तुलना करें जिनका इस्तेमाल आप कर रहे हैं. इससे यह पक्का किया जा सकेगा कि कोई गड़बड़ी या टाइपिंग की गलती नहीं है.

ध्यान रखें कि scope दावे में दायरों की सूची को कॉमा से नहीं, बल्कि स्पेस से अलग किए जाने की ज़रूरत है.

disabled_client The OAuth client was disabled. JWT के दावे पर हस्ताक्षर करने के लिए इस्तेमाल की जाने वाली कुंजी बंद है.

Google API Consoleपर जाएं और IAM & admin > Service Account के तहत, उस सेवा खाते को चालू करें जिसमें दावा करने के लिए &kot;Key ID&quat; का इस्तेमाल किया गया हो.

अतिरिक्त शर्तें: OAuth के बिना सेवा खाते की अनुमति देना

कुछ Google API की मदद से, आप OAuth 2.0 ऐक्सेस टोकन के बजाय, सीधे JET का इस्तेमाल करके, अनुमति वाले एपीआई कॉल कर सकते हैं. अगर मुमकिन हो, तो आप एपीआई कॉल करने से पहले, Google और #39; के ऑथराइज़ेशन सर्वर को नेटवर्क अनुरोध करने से बच सकते हैं.

आप जिस एपीआई को कॉल करना चाहते हैं उसके Google API GitHub डेटा संग्रह स्थान में एक सेवा डेफ़िनिशन प्रकाशित की गई है. आप ऐक्सेस टोकन के बजाय JWT का इस्तेमाल करके, अनुमति वाले एपीआई कॉल कर सकते हैं. इसके लिए:

  1. ऊपर बताए गए तरीके का इस्तेमाल करके, सेवा खाता बनाएं. पक्का करें कि खाता बनाते समय, आपको JSON फ़ाइल मिली हो.
  2. किसी भी स्टैंडर्ड JWT लाइब्रेरी का इस्तेमाल करके, जैसे कि jwt.io पर मिलती है, एक हेडर के साथ JWT बनाएं और नीचे दिए गए उदाहरण की तरह पेलोड करें:
    {
      "alg": "RS256",
      "typ": "JWT",
      "kid": "abcdef1234567890"
    }
    .
    {
      "iss": "123456-compute@developer.gserviceaccount.com",
      "sub": "123456-compute@developer.gserviceaccount.com",
      "aud": "https://firestore.googleapis.com/",
      "iat": 1511900000,
      "exp": 1511903600
    }
    • हेडर में kid फ़ील्ड के लिए, अपना सेवा खाता और # का निजी कुंजी आईडी बताएं. यह वैल्यू आपको अपने सेवा खाते की JSON फ़ाइल के private_key_id फ़ील्ड में मिल सकती है.
    • iss और sub फ़ील्ड के लिए, अपने सेवा खाते का ईमेल पता बताएं. यह वैल्यू आपको अपने सेवा खाते की JSON फ़ाइल के client_email फ़ील्ड में मिलेगी.
    • aud फ़ील्ड के लिए, एपीआई एंडपॉइंट के बारे में बताएं. उदाहरण के लिए: https://SERVICE.googleapis.com/.
    • iat फ़ील्ड के लिए, मौजूदा यूनिक्स समय के बारे में बताएं. exp फ़ील्ड के लिए समय के बारे में 3,600 सेकंड बाद बताएं, जब JWT की समयसीमा खत्म हो जाएगी.

अपने सेवा खाते की JSON फ़ाइल में मिली निजी कुंजी का इस्तेमाल करके, JWT के साथ आरएसए-256 पर हस्ताक्षर करें.

उदाहरण के लिए:

Java

google-api-java-client और java-jwt का इस्तेमाल करके,

GoogleCredential credential =
        GoogleCredential.fromStream(new FileInputStream("MyProject-1234.json"));
PrivateKey privateKey = credential.getServiceAccountPrivateKey();
String privateKeyId = credential.getServiceAccountPrivateKeyId();

long now = System.currentTimeMillis();

try {
    Algorithm algorithm = Algorithm.RSA256(null, privateKey);
    String signedJwt = JWT.create()
        .withKeyId(privateKeyId)
        .withIssuer("123456-compute@developer.gserviceaccount.com")
        .withSubject("123456-compute@developer.gserviceaccount.com")
        .withAudience("https://firestore.googleapis.com/")
        .withIssuedAt(new Date(now))
        .withExpiresAt(new Date(now + 3600 * 1000L))
        .sign(algorithm);
} catch ...

Python

PyJWT का इस्तेमाल करना:

iat = time.time()
exp = iat + 3600
payload = {'iss': '123456-compute@developer.gserviceaccount.com',
           'sub': '123456-compute@developer.gserviceaccount.com',
           'aud': 'https://firestore.googleapis.com/',
           'iat': iat,
           'exp': exp}
additional_headers = {'kid': PRIVATE_KEY_ID_FROM_JSON}
signed_jwt = jwt.encode(payload, PRIVATE_KEY_FROM_JSON, headers=additional_headers,
                       algorithm='RS256')
  1. एपीआई को बेयर टोकन के तौर पर साइन किए हुए JWT का इस्तेमाल करके कॉल करें:
    GET /v1/projects/abc/databases/123/indexes HTTP/1.1
    Authorization: Bearer SIGNED_JWT
    Host: firestore.googleapis.com