सर्वर से सर्वर अनुप्रयोगों के लिए OAuth 2.0 का उपयोग करना

Google OAuth 2.0 सिस्टम सर्वर-से-सर्वर इंटरैक्शन का समर्थन करता है जैसे कि वेब एप्लिकेशन और Google सेवा के बीच। इस परिदृश्य के लिए आप एक सेवा खाते की आवश्यकता है, जो एक खाता है कि आपके आवेदन करने के बजाय एक व्यक्ति अंत उपयोगकर्ता से संबंधित है। आपका एप्लिकेशन सेवा खाते की ओर से Google API को कॉल करता है, ताकि उपयोगकर्ता सीधे शामिल न हों। इस परिदृश्य को कभी-कभी "दो पैरों वाला OAuth" या "2LO" कहा जाता है। (संबंधित शब्द "थ्री-लेग्ड OAuth" उन परिदृश्यों को संदर्भित करता है जिनमें आपका एप्लिकेशन अंतिम उपयोगकर्ताओं की ओर से Google API को कॉल करता है, और जिसमें कभी-कभी उपयोगकर्ता की सहमति की आवश्यकता होती है।)

आमतौर पर, कोई एप्लिकेशन एक सेवा खाते का उपयोग करता है जब एप्लिकेशन उपयोगकर्ता के डेटा के बजाय अपने स्वयं के डेटा के साथ काम करने के लिए Google API का उपयोग करता है। उदाहरण के लिए, एक एप्लिकेशन जो डेटा दृढ़ता के लिए Google क्लाउड डेटास्टोर का उपयोग करता है, Google क्लाउड डेटास्टोर एपीआई को अपनी कॉल प्रमाणित करने के लिए एक सेवा खाते का उपयोग करेगा।

गूगल कार्यस्थान डोमेन व्यवस्थापकों भी कर सकते हैं सेवा अनुदान खातों डोमेन-व्यापी अधिकार डोमेन उपयोगकर्ताओं की ओर से उपयोगकर्ता डेटा एक्सेस करने हेतु।

यह दस्तावेज़ बताता है कि कैसे कोई एप्लिकेशन Google APIs क्लाइंट लाइब्रेरी (अनुशंसित) या HTTP का उपयोग करके सर्वर-से-सर्वर OAuth 2.0 प्रवाह को पूरा कर सकता है।

अवलोकन

समर्थन सर्वर से सर्वर बातचीत के लिए, पहले में अपनी परियोजना के लिए एक सेवा खाता बनाना API Console। यदि आप अपने Google कार्यस्थान खाते में उपयोगकर्ताओं के लिए उपयोगकर्ता डेटा तक पहुंच बनाना चाहते हैं, तो सेवा खाते के लिए डोमेन-व्यापी पहुंच प्रदान करें।

फिर, आपका एप्लिकेशन OAuth 2.0 प्रमाणन सर्वर से एक्सेस टोकन का अनुरोध करने के लिए सेवा खाते के क्रेडेंशियल्स का उपयोग करके अधिकृत API कॉल करने के लिए तैयार होता है।

अंत में, आपका एप्लिकेशन Google API को कॉल करने के लिए एक्सेस टोकन का उपयोग कर सकता है।

एक सेवा खाता बनाना

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

यदि आपका एप्लिकेशन Google ऐप इंजन पर चलता है, तो जब आप अपना प्रोजेक्ट बनाते हैं तो एक सेवा खाता स्वचालित रूप से सेट हो जाता है।

यदि आपका एप्लिकेशन Google कंप्यूट इंजन पर चलता है, तो आपके द्वारा अपना प्रोजेक्ट बनाते समय एक सेवा खाता भी स्वचालित रूप से सेट हो जाता है, लेकिन जब आप Google कंप्यूट इंजन इंस्टेंस बनाते हैं तो आपको उन क्षेत्रों को निर्दिष्ट करना होगा, जिन तक आपके एप्लिकेशन को पहुंच की आवश्यकता होती है। अधिक जानकारी के लिए, उपयोग सेवा खाते के लिए एक उदाहरण के लिए तैयार हो रहा

आपके आवेदन Google अनुप्रयोग इंजन या Google गणना इंजन पर नहीं चलता है, तो आप में इन क्रेडेंशियल्स प्राप्त करना होगा Google API Console। सेवा-खाता क्रेडेंशियल जनरेट करने के लिए, या आपके द्वारा पहले से जेनरेट किए गए सार्वजनिक क्रेडेंशियल देखने के लिए, निम्न कार्य करें:

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

  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मदद फ़ाइल।

सेवा खाते के ईमेल पते पर ध्यान दें और सेवा खाते की निजी कुंजी फ़ाइल को अपने आवेदन के लिए सुलभ स्थान पर संग्रहीत करें। अधिकृत API कॉल करने के लिए आपके एप्लिकेशन को उनकी आवश्यकता है।

सेवा खाते में डोमेन-व्यापी अधिकार सौंपना

यदि आपके पास एक Google कार्यस्थान खाता है, तो संगठन का एक व्यवस्थापक किसी एप्लिकेशन को Google कार्यस्थान डोमेन में उपयोगकर्ताओं की ओर से उपयोगकर्ता डेटा तक पहुंचने के लिए अधिकृत कर सकता है। उदाहरण के लिए, एक एप्लिकेशन जो Google कार्यस्थान डोमेन में सभी उपयोगकर्ताओं के कैलेंडर में ईवेंट जोड़ने के लिए Google कैलेंडर API का उपयोग करता है, वह उपयोगकर्ताओं की ओर से Google कैलेंडर API तक पहुंचने के लिए एक सेवा खाते का उपयोग करेगा। किसी डोमेन में उपयोगकर्ताओं की ओर से डेटा तक पहुंचने के लिए किसी सेवा खाते को अधिकृत करने को कभी-कभी सेवा खाते में "डोमेन-व्यापी प्राधिकरण सौंपना" कहा जाता है।

किसी सेवा खाते को डोमेन-व्यापी अधिकार सौंपने के लिए, Google कार्यस्थान डोमेन के एक सुपर व्यवस्थापक को निम्नलिखित चरणों को पूरा करना होगा:

  1. अपने Google कार्यस्थान डोमेन के से व्यवस्थापक कंसोल , मुख्य मेनू के लिए जाना > सुरक्षा> API नियंत्रण।
  2. डोमेन विस्तृत प्रतिनिधिमंडल फलक में, डोमेन प्रबंधित करें वाइड प्रतिनिधिमंडल का चयन करें।
  3. क्लिक करें नई जोड़ें।
  4. ग्राहक आईडी क्षेत्र में, सेवा खाते के ग्राहक ID दर्ज करें। आप अपनी सेवा खाते के ग्राहक आईडी देख सकते हैं Service accounts page
  5. OAuth स्कोप में (अल्पविराम-प्रतिबंधित) क्षेत्र, स्कोप की सूची है कि आपके आवेदन को पहुंच प्रदान की जानी चाहिए दर्ज करें। उदाहरण के लिए, आपके आवेदन Google डिस्क API और Google कैलेंडर API करने के लिए डोमेन-व्यापी पूरा उपयोग की जरूरत है, दर्ज करें: https://www.googleapis.com/auth/drive, https://www.googleapis.com/auth / कैलेंडर।
  6. अधिकृत क्लिक करें।

आपके एप्लिकेशन के पास अब आपके डोमेन में उपयोगकर्ताओं के रूप में API कॉल करने का अधिकार है ("प्रतिरूपण" करने वाले उपयोगकर्ता)। जब आप अधिकृत API कॉल करने की तैयारी करते हैं, तो आप उपयोगकर्ता को प्रतिरूपण करने के लिए निर्दिष्ट करते हैं।

अधिकृत API कॉल करने की तैयारी

जावा

आप से ग्राहक ईमेल पते और निजी कुंजी प्राप्त करने के बाद API Console, का उपयोग जावा के लिए Google API क्लाइंट लाइब्रेरी एक बनाने के लिए GoogleCredential सेवा खाते के क्रेडेंशियल से वस्तु और scopes अपने आवेदन के लिए उपयोग की जरूरत है। उदाहरण के लिए:

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 मेघ प्लेटफ़ॉर्म पर कोई ऐप्लिकेशन विकसित कर रहे हैं, तो आप उपयोग कर सकते हैं आवेदन डिफ़ॉल्ट क्रेडेंशियल्स के बजाय, प्रक्रिया को सरल कर सकते हैं।

प्रतिनिधि डोमेन-व्यापी प्राधिकरण

आप सेवा खाते में डोमेन-व्यापी पहुँच सौंप दी है, और आप एक उपयोगकर्ता खाते का रूप धारण करना चाहते हैं, के साथ उपयोगकर्ता खाते का ईमेल पता निर्दिष्ट createDelegated की विधि GoogleCredential वस्तु। उदाहरण के लिए:

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

का प्रयोग करें GoogleCredential वस्तु अपने आवेदन में Google API कॉल करने के लिए।

अजगर

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

  1. एक बनाएं Credentials सेवा खाते के क्रेडेंशियल से वस्तु और scopes अपने आवेदन के लिए उपयोग की जरूरत है। उदाहरण के लिए:
    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 मेघ प्लेटफ़ॉर्म पर कोई ऐप्लिकेशन विकसित कर रहे हैं, तो आप उपयोग कर सकते हैं आवेदन डिफ़ॉल्ट क्रेडेंशियल्स के बजाय, प्रक्रिया को सरल कर सकते हैं।

  2. प्रतिनिधि डोमेन-व्यापी प्राधिकरण

    आप सेवा खाते में डोमेन-व्यापी पहुँच सौंप दी है, और आप एक उपयोगकर्ता खाते का रूप धारण करना चाहते हैं, का उपयोग with_subject एक मौजूदा की विधि ServiceAccountCredentials वस्तु। उदाहरण के लिए:

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

अपने एप्लिकेशन में Google API को कॉल करने के लिए क्रेडेंशियल ऑब्जेक्ट का उपयोग करें।

HTTP/REST

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

  1. एक JSON वेब टोकन बनाएं (JWT, उच्चारण, "जोट") जिसमें एक हेडर, एक दावा सेट और एक हस्ताक्षर शामिल है।
  2. Google OAuth 2.0 प्राधिकरण सर्वर से एक्सेस टोकन का अनुरोध करें।
  3. JSON प्रतिक्रिया को संभालें जो प्राधिकरण सर्वर लौटाता है।

अनुसरण करने वाले अनुभाग वर्णन करते हैं कि इन चरणों को कैसे पूरा किया जाए।

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

जब पहुँच टोकन समाप्त हो रहा है , आपके आवेदन एक और जेडब्ल्यूटी, संकेत यह उत्पन्न करता है, और एक अन्य पहुँच टोकन अनुरोध करता है।

आपका सर्वर एप्लिकेशन Google प्राधिकरण सर्वर से टोकन का अनुरोध करने के लिए JWT का उपयोग करता है, फिर Google API समापन बिंदु को कॉल करने के लिए टोकन का उपयोग करता है। कोई अंतिम उपयोगकर्ता शामिल नहीं है।

इस खंड के बाकी हिस्सों में JWT बनाने, JWT पर हस्ताक्षर करने, एक्सेस टोकन अनुरोध बनाने और प्रतिक्रिया को संभालने की बारीकियों का वर्णन है।

एक जेडब्ल्यूटी बनाना

एक JWT तीन भागों से बना होता है: एक हेडर, एक दावा सेट और एक हस्ताक्षर। हेडर और दावा सेट JSON ऑब्जेक्ट हैं। इन JSON ऑब्जेक्ट्स को UTF-8 बाइट्स में क्रमबद्ध किया जाता है, फिर बेस64url एन्कोडिंग का उपयोग करके एन्कोड किया जाता है। यह एन्कोडिंग बार-बार एन्कोडिंग संचालन के कारण एन्कोडिंग परिवर्तनों के खिलाफ लचीलापन प्रदान करता है। शीर्ष लेख, दावा सेट, और हस्ताक्षर अवधि (के साथ एक साथ concatenated रहे हैं . ) चरित्र।

एक JWT इस प्रकार बना है:

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

हस्ताक्षर के लिए आधार स्ट्रिंग इस प्रकार है:

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

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

सेवा खाते RSA SHA-256 एल्गोरिथम और JWT टोकन प्रारूप पर निर्भर करते हैं। नतीजतन, हेडर का JSON प्रतिनिधित्व इस प्रकार है:

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

इसका बेस 64url प्रतिनिधित्व इस प्रकार है:

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

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

आवश्यक दावे

JWT दावा सेट में आवश्यक दावे नीचे दिखाए गए हैं। वे दावा सेट में किसी भी क्रम में प्रकट हो सकते हैं।

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

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
}
अतिरिक्त दावे

कुछ एंटरप्राइज़ मामलों में, कोई एप्लिकेशन किसी संगठन में किसी विशेष उपयोगकर्ता की ओर से कार्य करने के लिए डोमेन-व्यापी प्रतिनिधिमंडल का उपयोग कर सकता है। इस प्रकार के प्रतिरूपण को करने की अनुमति किसी एप्लिकेशन द्वारा किसी उपयोगकर्ता का प्रतिरूपण करने से पहले दी जानी चाहिए, और आमतौर पर एक सुपर व्यवस्थापक द्वारा नियंत्रित किया जाता है। अधिक जानकारी के लिए, डोमेन-व्यापी प्रतिनिधिमंडल के साथ नियंत्रण एपीआई पहुँच

कि अनुदान एक आवेदन एक संसाधन के लिए उपयोग सौंप टोकन एक पहुँच प्राप्त करने के लिए, के मूल्य के रूप में जेडब्ल्यूटी दावा सेट में उपयोगकर्ता का ईमेल पता शामिल sub क्षेत्र।

नाम विवरण
sub उपयोगकर्ता का ईमेल पता जिसके लिए एप्लिकेशन प्रत्यायोजित पहुंच का अनुरोध कर रहा है।

एक आवेदन एक उपयोगकर्ता, पहुंच टोकन अनुरोध भी शामिल है कि के जवाब का रूप धारण करने की अनुमति नहीं है, तो sub क्षेत्र एक हो जाएगा त्रुटि

एक जेडब्ल्यूटी दावा सेट है जिसमें शामिल का एक उदाहरण 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 दावा सेट को कूटबद्ध करना

जेडब्ल्यूटी हेडर की तरह, जेडब्ल्यूटी दावा सेट को यूटीएफ -8 और बेस 64url-सुरक्षित एन्कोडेड में क्रमबद्ध किया जाना चाहिए। 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 हेडर में हस्ताक्षर एल्गोरिथ्म का उपयोग किया जाना चाहिए। Google OAuth 2.0 प्राधिकरण सर्वर द्वारा समर्थित एकमात्र हस्ताक्षर एल्गोरिथम SHA-256 हैशिंग एल्गोरिथम का उपयोग करने वाला RSA है। यह के रूप में व्यक्त किया जाता है RS256 में alg जेडब्ल्यूटी शीर्षक में क्षेत्र।

साइन निजी कुंजी से प्राप्त के साथ इनपुट SHA256withRSA का उपयोग कर (यह भी SHA-256 हैश समारोह के साथ RSASSA-PKCS1-V1_5-संकेत के रूप में जाना जाता है) के लिए UTF-8 प्रतिनिधित्व Google API Console। आउटपुट एक बाइट ऐरे होगा।

तब हस्ताक्षर बेस64url एन्कोडेड होना चाहिए। शीर्ष लेख, दावा सेट, और हस्ताक्षर अवधि (के साथ एक साथ concatenated रहे हैं . ) चरित्र। परिणाम जेडब्ल्यूटी है। यह निम्नलिखित होना चाहिए (स्पष्टता के लिए लाइन ब्रेक जोड़े गए):

{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 जनरेट करने के बाद, एक एप्लिकेशन एक्सेस टोकन का अनुरोध करने के लिए इसका उपयोग कर सकता है। अनुरोध टोकन यह पहुँच एक HTTPS है POST अनुरोध है, और शरीर यूआरएल इनकोडिंग है। यूआरएल नीचे दिखाया गया है:

https://oauth2.googleapis.com/token

निम्नलिखित मानकों HTTPS में आवश्यक हैं POST अनुरोध:

नाम विवरण
grant_type : निम्न स्ट्रिंग का उपयोग करें, के रूप में आवश्यक URL- एनकोडेड urn:ietf:params:oauth:grant-type:jwt-bearer
assertion हस्ताक्षर सहित जेडब्ल्यूटी।

नीचे HTTPS के एक कच्चे डंप है 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 को कॉल करना

जावा

का प्रयोग करें GoogleCredential निम्न चरण पूरे करके Google API के कॉल करने के लिए वस्तु:

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

अजगर

का प्रयोग करें अधिकृत Credentials निम्न चरण पूरे करके Google API के फोन पर आपत्ति:

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

HTTP/REST

आपके एप्लिकेशन को एक एक्सेस टोकन प्राप्त होने के बाद, आप किसी दिए गए सेवा खाते या उपयोगकर्ता खाते की ओर से Google API पर कॉल करने के लिए टोकन का उपयोग कर सकते हैं यदि API द्वारा आवश्यक एक्सेस का दायरा प्रदान किया गया है। ऐसा करने के लिए पहुँच एपीआई के लिए एक अनुरोध में टोकन या तो एक को शामिल करके शामिल access_token क्वेरी पैरामीटर या एक Authorization HTTP हेडर Bearer मूल्य। जब संभव हो, HTTP शीर्षलेख बेहतर होता है, क्योंकि सर्वर लॉग में क्वेरी स्ट्रिंग्स दिखाई देने की प्रवृत्ति होती है। ज्यादातर मामलों में आप गूगल एपीआई के लिए अपने कॉल स्थापित करने के लिए एक क्लाइंट लाइब्रेरी का उपयोग कर सकते हैं (उदाहरण के लिए, जब ड्राइव फ़ाइलें एपीआई बुला )।

आप सभी को Google API बाहर कोशिश करते हैं और पर अपने कार्यक्षेत्रों देख सकते हैं OAuth 2.0 खेल का मैदान

HTTP उदाहरण प्राप्त करें

करने के लिए एक कॉल drive.files endpoint (ड्राइव फ़ाइलें एपीआई) का उपयोग करते हुए Authorization: Bearer HTTP हेडर ऐसा दिखाई दे सकता। ध्यान दें कि आपको अपना स्वयं का एक्सेस टोकन निर्दिष्ट करने की आवश्यकता है:

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 कमांड लाइन आवेदन। यहां एक उदाहरण दिया गया है जो HTTP शीर्षलेख विकल्प (पसंदीदा) का उपयोग करता है:

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

जब एक्सेस टोकन समाप्त हो जाते हैं

पहुँच गूगल OAuth 2.0 प्राधिकरण सर्वर द्वारा जारी किए गए टोकन द्वारा प्रदान की अवधि के बाद समाप्त हो expires_in मूल्य। जब एक एक्सेस टोकन समाप्त हो जाता है, तो एप्लिकेशन को एक और जेडब्ल्यूटी उत्पन्न करना चाहिए, उस पर हस्ताक्षर करना चाहिए, और दूसरे एक्सेस टोकन का अनुरोध करना चाहिए।

JWT त्रुटि कोड

error क्षेत्र error_description क्षेत्र अर्थ कैसे हल करें
unauthorized_client Unauthorized client or scope in request. यदि आप डोमेन-व्यापी डेलिगेशन का उपयोग करने का प्रयास कर रहे हैं, तो उपयोगकर्ता के डोमेन के Admin console में सेवा खाता अधिकृत नहीं है।

सुनिश्चित करें कि सेवा खाते में अधिकृत किया गया है डोमेन चौड़ा प्रतिनिधिमंडल में उपयोगकर्ता के लिए व्यवस्थापक कंसोल के पेज sub दावा (क्षेत्र)।

हालांकि इसमें आमतौर पर कुछ मिनट लगते हैं, लेकिन प्राधिकरण को आपके 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 में क्लाइंट आईडी (संख्यात्मक) के बजाय क्लाइंट ईमेल पते का उपयोग करके एक सेवा खाते को अधिकृत किया गया था। में डोमेन-व्यापी प्रतिनिधिमंडल व्यवस्थापक कंसोल में पेज, ग्राहक को दूर है, और यह अंकीय आईडी के साथ फिर से जोड़ना।
access_denied (कोई मान) यदि आप डोमेन-व्यापी प्रतिनिधिमंडल का उपयोग कर रहे हैं, तो Admin console में एक या अधिक अनुरोधित क्षेत्र अधिकृत नहीं हैं।

सुनिश्चित करें कि सेवा खाते में अधिकृत किया गया है डोमेन चौड़ा प्रतिनिधिमंडल में उपयोगकर्ता के लिए व्यवस्थापक कंसोल के पेज sub दावा (क्षेत्र), और है कि यह शामिल है के सभी दायरों में से किसी में अनुरोध कर रहे हैं scope अपने जेडब्ल्यूटी के दावे।

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

invalid_grant Not a valid email. उपयोगकर्ता मौजूद नहीं है। जाँच करें कि ई-मेल पते में 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 मूल्य से भविष्य में अधिक से अधिक 65 मिनट है iat मूल्य, या exp मान से कम है iat मूल्य।

सुनिश्चित करें कि जिस सिस्टम पर JWT उत्पन्न होता है वह घड़ी सही है। यदि आवश्यक हो, साथ अपना समय सिंक गूगल एनटीपी

invalid_grant Invalid JWT Signature.

JWT अभिकथन एक निजी कुंजी के साथ हस्ताक्षरित है जो क्लाइंट ईमेल द्वारा पहचाने गए सेवा खाते से संबद्ध नहीं है या उपयोग की गई कुंजी को हटा दिया गया है, अक्षम कर दिया गया है, या समाप्त हो गया है।

वैकल्पिक रूप से, JWT अभिकथन को गलत तरीके से एन्कोड किया जा सकता है - यह बेस 64-एन्कोडेड होना चाहिए, बिना न्यूलाइन या समान संकेतों के पैडिंग।

JWT दावा सेट को डिकोड करें और सत्यापित करें कि अभिकथन पर हस्ताक्षर करने वाली कुंजी सेवा खाते से जुड़ी है।

यह सुनिश्चित करने के लिए कि JWT सही ढंग से उत्पन्न हुआ है, Google द्वारा प्रदत्त OAuth लाइब्रेरी का उपयोग करने का प्रयास करें।

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

सुनिश्चित करें कि scope जेडब्ल्यूटी के दावे (क्षेत्र) से भर जाता है, और यह सुनिश्चित करने के लिए कोई त्रुटि या ग़लतियां नहीं हैं, स्कोप तुलना में यह एपीआई का उपयोग करना चाहते के लिए दस्तावेज स्कोप के साथ होता है कि,।

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

disabled_client The OAuth client was disabled. JWT अभिकथन पर हस्ताक्षर करने के लिए उपयोग की जाने वाली कुंजी अक्षम है।

पर जाएं Google API Console, और IAM एवं व्यवस्थापक> सेवा खाते के अंतर्गत है, जो "कुंजी आईडी" अभिकथन पर हस्ताक्षर करने के लिए इस्तेमाल होता है सेवा खाता सक्षम करें।

परिशिष्ट: OAuth के बिना सेवा खाता प्राधिकरण

कुछ Google API के साथ, आप OAuth 2.0 एक्सेस टोकन के बजाय सीधे एक बियरर टोकन के रूप में हस्ताक्षरित JWT का उपयोग करके अधिकृत API कॉल कर सकते हैं। जब यह संभव हो, तो आप API कॉल करने से पहले Google के प्राधिकरण सर्वर से नेटवर्क अनुरोध करने से बच सकते हैं।

एपीआई आप कॉल करना चाहते हैं एक सेवा परिभाषा में प्रकाशित है, तो Google API के GitHub भंडार , आप अधिकृत API कॉल को जेडब्ल्यूटी के बजाय एक पहुँच टोकन का उपयोग कर सकते हैं। ऐसा करने के लिए:

  1. एक सेवा खाता बनाने के रूप में ऊपर वर्णित है। खाता बनाते समय आपको प्राप्त होने वाली JSON फ़ाइल को रखना सुनिश्चित करें।
  2. किसी भी मानक जेडब्ल्यूटी पुस्तकालय का उपयोग करना, एक में पाया जैसे jwt.io , एक शीर्षक और निम्न उदाहरण की तरह पेलोड के साथ एक जेडब्ल्यूटी बनाएँ:
    {
      "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 हेडर में मौजूद फ़ील्ड, आपकी सेवा खाते के निजी कुंजी आईडी निर्दिष्ट करें। आप में यह मान पा सकते हैं private_key_id आपके सेवा खाते JSON फ़ाइल के क्षेत्र।
    • के लिए iss और sub क्षेत्रों, आपके सेवा खाते का ईमेल पता निर्दिष्ट। आप में यह मान पा सकते हैं client_email आपके सेवा खाते JSON फ़ाइल के क्षेत्र।
    • के लिए aud क्षेत्र, एपीआई अंत बिंदु निर्दिष्ट करें। उदाहरण के लिए: https:// SERVICE .googleapis.com/
    • के लिए iat क्षेत्र, वर्तमान यूनिक्स समय निर्दिष्ट करें, और के लिए exp क्षेत्र, वास्तव में 3600 सेकंड बाद में, जब जेडब्ल्यूटी समाप्त हो जाएगा समय निर्दिष्ट करें।

अपने सेवा खाते JSON फ़ाइल में मिली निजी कुंजी का उपयोग करके RSA-256 के साथ JWT पर हस्ताक्षर करें।

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

जावा

का उपयोग करते हुए गूगल-api-जावा-ग्राहक और जावा-जेडब्ल्यूटी :

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 ...

अजगर

का उपयोग करते हुए 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. एपीआई कॉल, पर हस्ताक्षर किए जेडब्ल्यूटी का उपयोग कर के रूप में वाहक टोकन:
    GET /v1/projects/abc/databases/123/indexes HTTP/1.1
    Authorization: Bearer SIGNED_JWT
    Host: firestore.googleapis.com