Google OAuth 2.0 सिस्टम सर्वर-से-सर्वर इंटरैक्शन का समर्थन करता है जैसे कि वेब एप्लिकेशन और Google सेवा के बीच। इस परिदृश्य के लिए आपको एक सेवा खाते की आवश्यकता होती है, जो एक ऐसा खाता है जो एक व्यक्तिगत अंतिम उपयोगकर्ता के बजाय आपके आवेदन से संबंधित है। आपका एप्लिकेशन सेवा खाते की ओर से Google API को कॉल करता है, इसलिए उपयोगकर्ता सीधे इसमें शामिल नहीं होते हैं। इस परिदृश्य को कभी-कभी "दो-पैर वाला Outh" या "2LO" कहा जाता है। (संबंधित शब्द "थ्री-लेग्ड OAuth" उन परिदृश्यों को संदर्भित करता है जिसमें आपका एप्लिकेशन अंतिम उपयोगकर्ताओं की ओर से Google API को कॉल करता है, और जिसमें उपयोगकर्ता की सहमति कभी-कभी आवश्यक होती है।
आमतौर पर, एक एप्लिकेशन सेवा खाते का उपयोग करता है जब एप्लिकेशन उपयोगकर्ता के डेटा के बजाय अपने स्वयं के डेटा के साथ काम करने के लिए Google API का उपयोग करता है। उदाहरण के लिए, डेटा दृढ़ता के लिए Google क्लाउड डेटास्टोर का उपयोग करने वाला एप्लिकेशन Google क्लाउड डेटास्टोर API पर अपनी कॉल प्रमाणित करने के लिए एक सेवा खाते का उपयोग करेगा।
जी सुइट डोमेन व्यवस्थापक डोमेन में उपयोगकर्ताओं की ओर से उपयोगकर्ता डेटा तक पहुंचने के लिए सेवा खाते को डोमेन-वाइड प्राधिकरण भी दे सकते हैं।
यह दस्तावेज़ बताता है कि कोई एप्लिकेशन या तो Google API क्लाइंट लाइब्रेरी (अनुशंसित) या HTTP का उपयोग करके सर्वर-से-सर्वर OAuth 2.0 प्रवाह को कैसे पूरा कर सकता है।
अवलोकन
सर्वर-टू-सर्वर इंटरैक्शन का समर्थन करने के लिए, पहले API Console में अपनी परियोजना के लिए एक सेवा खाता बनाएं। यदि आप अपने G Suite डोमेन के उपयोगकर्ताओं के लिए उपयोगकर्ता डेटा एक्सेस करना चाहते हैं, तो डोमेन-वाइड का उपयोग सेवा खाते में करें।
उसके बाद, आपका एप्लिकेशन OAuth 2.0 के सामान्य सर्वर से पहुंच टोकन का अनुरोध करने के लिए सेवा खाते की क्रेडेंशियल्स का उपयोग करके अधिकृत एपीआई कॉल करने के लिए तैयार करता है।
अंत में, आपका एप्लिकेशन Google API को कॉल करने के लिए एक्सेस टोकन का उपयोग कर सकता है।
सेवा खाता बनाना
एक सेवा खाते के क्रेडेंशियल्स में एक उत्पन्न ईमेल पता शामिल होता है जो अद्वितीय और कम से कम एक सार्वजनिक / निजी कुंजी जोड़ी होता है। यदि डोमेन-वाइड डेलिगेशन सक्षम है, तो क्लाइंट आईडी भी सेवा खाते की साख का हिस्सा है।
यदि आपका एप्लिकेशन Google App Engine पर चलता है, तो आप अपना प्रोजेक्ट बनाते समय एक सेवा खाता अपने आप सेट हो जाता है।
यदि आपका एप्लिकेशन Google कंप्यूट इंजन पर चलता है, तो एक प्रोजेक्ट खाता भी स्वचालित रूप से सेट किया जाता है जब आप अपनी परियोजना बनाते हैं, लेकिन आपको उन स्कॉप्स को निर्दिष्ट करना होगा जो आपके एप्लिकेशन को Google कम्प्यूट इंजन उदाहरण बनाते समय एक्सेस की आवश्यकता होती है। अधिक जानकारी के लिए, सेवा खातों का उपयोग करने के लिए एक उदाहरण तैयार करना देखें।
यदि आपका एप्लिकेशन Google App Engine या Google Compute Engine पर नहीं चलता है, तो आपको Google API Console में इन क्रेडेंशियल्स को प्राप्त करना होगा। सेवा-खाता क्रेडेंशियल जनरेट करने के लिए, या आपके द्वारा पहले से उत्पन्न सार्वजनिक क्रेडेंशियल्स को देखने के लिए, निम्न कार्य करें:
- Service accounts page खोलें।
- If prompted, select a project, or create a new one.
- सर्विस अकाउंट क्लिक करें।
- सेवा खाता विवरण के तहत, सेवा खाते के लिए एक नाम, आईडी और विवरण टाइप करें, फिर बनाएँ पर क्लिक करें ।
- वैकल्पिक: सेवा खाता अनुमतियों के तहत, सेवा खाते को देने के लिए IAM भूमिकाओं का चयन करें, फिर जारी रखें पर क्लिक करें।
- वैकल्पिक: इस सेवा खाते तक उपयोगकर्ताओं की पहुंच के तहत, उन उपयोगकर्ताओं या समूहों को जोड़ें जिन्हें सेवा खाते का उपयोग करने और प्रबंधित करने की अनुमति है।
- key पर क्लिक करें , फिर Create पर क्लिक करें ।
आपकी नई सार्वजनिक / निजी कुंजी जोड़ी उत्पन्न होती है और आपकी मशीन पर डाउनलोड की जाती है; यह निजी कुंजी की एकमात्र प्रति के रूप में कार्य करता है। आप इसे सुरक्षित रूप से संग्रहीत करने के लिए जिम्मेदार हैं। यदि आप इस कुंजी जोड़ी को खो देते हैं, तो आपको एक नया जनरेट करना होगा।
यदि आपको सेवा खाते के लिए जी सूट डोमेन-वाइड प्राधिकरण देने की आवश्यकता है, तो आपके द्वारा बनाए गए सेवा खाते के ईमेल पते पर क्लिक करें, फिर अद्वितीय आईडी बॉक्स से मूल्य की प्रतिलिपि बनाएँ।
सेवा खाते में प्राधिकरण को सौंपने के लिए, ग्राहक आईडी के रूप में आपके द्वारा कॉपी किए गए मान का उपयोग करें।
आप ईमेल पता, सार्वजनिक कुंजी फ़िंगरप्रिंट और अन्य जानकारी देखने के लिए, या अतिरिक्त सार्वजनिक / निजी कुंजी जोड़े उत्पन्न करने के लिए किसी भी समय API Console पर लौट सकते हैं। API Console में सेवा खाता क्रेडेंशियल्स के बारे में अधिक जानकारी के लिए, 0df9a22e2 मदद फ़ाइल में सेवा खाते देखें।
सेवा खाते के ईमेल पते पर ध्यान दें और आपके आवेदन के लिए सुलभ स्थान पर सेवा खाते की निजी कुंजी फ़ाइल संग्रहीत करें। आपके एप्लिकेशन को उन्हें अधिकृत API कॉल करने की आवश्यकता है।
सेवा खाते में डोमेन-व्यापी प्राधिकारी का प्रतिनिधि
यदि आपके पास एक जी सूट डोमेन है - यदि आप जी सूट का उपयोग करते हैं, उदाहरण के लिए- जी सूट डोमेन का एक प्रशासक जी सूट डोमेन में उपयोगकर्ताओं की ओर से उपयोगकर्ता डेटा तक पहुंचने के लिए एक आवेदन को अधिकृत कर सकता है। उदाहरण के लिए, एक एप्लिकेशन जो Google कैलेंडर API का उपयोग करके G सूट डोमेन के सभी उपयोगकर्ताओं के कैलेंडर में ईवेंट जोड़ता है, उपयोगकर्ताओं की ओर से Google कैलेंडर API तक पहुंचने के लिए एक सेवा खाते का उपयोग करेगा। किसी डोमेन में उपयोगकर्ताओं की ओर से डेटा तक पहुँचने के लिए एक सेवा खाते को अधिकृत करना कभी-कभी सेवा खाते के लिए "डोमेन-वाइड प्राधिकरण को सौंपना" के रूप में संदर्भित किया जाता है।
डोमेन-वाइड प्राधिकरण को एक सेवा खाते में सौंपने के लिए, पहले Service accounts page में मौजूदा सेवा खाते के लिए डोमेन-वाइड प्रतिनिधिमंडल को सक्षम करें या डोमेन-विस्तृत प्रतिनिधि सक्षम के साथ एक नया सेवा खाता बनाएं ।
फिर, जी सूट डोमेन के एक सुपर प्रशासक को निम्नलिखित चरणों को पूरा करना होगा:
- अपने जी सूट डोमेन के व्यवस्थापक कंसोल से , मुख्य मेनू > सुरक्षा> एपीआई नियंत्रण पर जाएं ।
- डोमेन विस्तृत प्रतिनिधि फलक में, डोमेन विस्तृत प्रतिनिधि प्रबंधित करें चुनें।
- नया जोड़ें पर क्लिक करें।
- क्लाइंट आईडी फ़ील्ड में, सेवा खाते की क्लाइंट आईडी दर्ज करें । आप अपने सेवा खाते की क्लाइंट आईडी Service accounts page में पा सकते हैं।
- OAuth स्कोप्स (अल्पविराम-सीमांकित) फ़ील्ड में, उन स्कोपों की सूची दर्ज करें जिन्हें आपके एप्लिकेशन को एक्सेस की अनुमति दी जानी चाहिए। उदाहरण के लिए, यदि आपके एप्लिकेशन को Google डिस्क API और Google कैलेंडर API के लिए डोमेन-वाइड पूर्ण एक्सेस की आवश्यकता है, तो दर्ज करें: https://www.googleapis.com/auth/drive, https://www.googleapis.com/auth / कैलेंडर
- अधिकृत करें पर क्लिक करें।
आपके आवेदन में अब आपके डोमेन में उपयोगकर्ताओं के रूप में एपीआई कॉल करने का अधिकार है (उपयोगकर्ताओं को "प्रतिरूपित" करने के लिए)। जब आप अधिकृत API कॉल करने की तैयारी करते हैं, तो आप उपयोगकर्ता को प्रतिरूपण करने के लिए निर्दिष्ट करते हैं।
अधिकृत API कॉल करने की तैयारी कर रहा है
जावा
जब आप API Console से क्लाइंट ईमेल पता और निजी कुंजी प्राप्त करते हैं, तो सेवा खाते की क्रेडेंशियल्स से GoogleCredential
ऑब्जेक्ट बनाने के लिए जावा के लिए Google APIs क्लाइंट लाइब्रेरी का उपयोग करें और आपके एप्लिकेशन को जिस एक्सेस की आवश्यकता होती है। उदाहरण के लिए:
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
ऑब्जेक्ट की createDelegated
विधि के साथ निर्दिष्ट करें। उदाहरण के लिए:
GoogleCredential credential = GoogleCredential.fromStream(new FileInputStream("MyProject-1234.json")) .createScoped(Collections.singleton(SQLAdminScopes.SQLSERVICE_ADMIN)) .createDelegated("user@example.com");
अपने एप्लिकेशन में Google API को कॉल करने के लिए GoogleCredential
ऑब्जेक्ट का उपयोग करें।
अजगर
क्लाइंट ईमेल पता और निजी कुंजी API Console से प्राप्त करने के बाद, निम्न चरणों को पूरा करने के लिए पायथन के लिए Google API क्लाइंट लाइब्रेरी का उपयोग करें:
- सेवा खाते के क्रेडेंशियल से
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 क्लाउड प्लेटफ़ॉर्म पर एक ऐप विकसित कर रहे हैं, तो आप इसके बजाय एप्लिकेशन डिफ़ॉल्ट क्रेडेंशियल्स का उपयोग कर सकते हैं, जो प्रक्रिया को सरल बना सकता है।
- प्रतिनिधि डोमेन-व्यापी प्राधिकरण
यदि आपने डोमेन-वाइड को सेवा खाते तक पहुँचा दिया है और आप उपयोगकर्ता खाते को लागू करना चाहते हैं, तो किसी मौजूदा
ServiceAccountCredentials
ऑब्जेक्ट कीwith_subject
विधि का उपयोग करें। उदाहरण के लिए:delegated_credentials = credentials.with_subject('user@example.org')
अपने एप्लिकेशन में Google API को कॉल करने के लिए क्रेडेंशियल ऑब्जेक्ट का उपयोग करें।
HTTP / REST
क्लाइंट आईडी और निजी कुंजी को API Console से प्राप्त करने के बाद, आपके आवेदन को निम्न चरणों को पूरा करना होगा:
- एक JSON वेब टोकन (JWT, उच्चारण, "जोत") बनाएं जिसमें एक हेडर, एक दावा सेट और एक हस्ताक्षर शामिल हैं।
- Google OAuth 2.0 प्राधिकरण सर्वर से पहुंच टोकन का अनुरोध करें।
- उस JSON प्रतिक्रिया को हैंडल करें जो प्राधिकरण सर्वर देता है।
पालन करने वाले अनुभाग इन चरणों को पूरा करने का वर्णन करते हैं।
यदि प्रतिक्रिया में एक्सेस टोकन शामिल है, तो आप Google API को कॉल करने के लिए एक्सेस टोकन का उपयोग कर सकते हैं। (यदि प्रतिक्रिया में एक्सेस टोकन शामिल नहीं है, तो आपका JWT और टोकन अनुरोध ठीक से नहीं बन सकता है, या सेवा खाते में अनुरोध किए गए स्कोप तक पहुंचने की अनुमति नहीं हो सकती है।)
जब एक्सेस टोकन समाप्त हो जाता है , तो आपका एप्लिकेशन एक और JWT उत्पन्न करता है, उस पर हस्ताक्षर करता है, और दूसरे एक्सेस टोकन के लिए अनुरोध करता है।

इस खंड के बाकी हिस्से में जेडब्ल्यूटी बनाने, जेडब्ल्यूटी पर हस्ताक्षर करने, एक्सेस टोकन अनुरोध बनाने और प्रतिक्रिया को संभालने की बारीकियों का वर्णन है।
एक JWT बनाना
एक JWT तीन भागों से बना है: एक हेडर, एक क्लेम सेट और एक हस्ताक्षर। हेडर और क्लेम सेट JSON ऑब्जेक्ट हैं। इन JSON ऑब्जेक्ट्स को UTF-8 बाइट्स में क्रमबद्ध किया जाता है, फिर बेस 64url एन्कोडिंग का उपयोग करके एन्कोड किया जाता है। यह एन्कोडिंग बार-बार एन्कोडिंग संचालन के कारण एन्कोडिंग परिवर्तनों के खिलाफ लचीलापन प्रदान करता है। हेडर, क्लेम सेट और सिग्नेचर को एक अवधि ( .
) वर्ण के साथ समेटा जाता है।
एक 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"}
इस का Base64url प्रतिनिधित्व इस प्रकार है:
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 UTC, 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
क्षेत्र के मान के रूप में सेट JWT दावे में उपयोगकर्ता का ईमेल पता शामिल करता है।
नाम | विवरण |
---|---|
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) वह विनिर्देश है जो JWT के लिए हस्ताक्षर बनाने के यांत्रिकी का मार्गदर्शन करता है। हस्ताक्षर के लिए इनपुट निम्नलिखित सामग्री का बाइट सरणी है:
{Base64url encoded header}.{Base64url encoded claim set}
हस्ताक्षर की गणना करते समय JWT हेडर में हस्ताक्षर एल्गोरिथ्म का उपयोग किया जाना चाहिए। Google OAuth 2.0 प्राधिकरण सर्वर द्वारा समर्थित एकमात्र हस्ताक्षरित एल्गोरिथ्म SHA-256 हैशिंग एल्गोरिथ्म का उपयोग करके RSA है। यह JWT हेडर में alg
फील्ड में RS256
रूप में व्यक्त किया गया है।
0A88ed2470 से प्राप्त निजी कुंजी के साथ SHA256withRSA (जिसे RSASSA-PKCS1-V1_5- SHA-256 हैश फ़ंक्शन के रूप में भी जाना जाता है) के रूप में उपयोग करके इनपुट के UTF-8 प्रतिनिधित्व पर हस्ताक्षर करें। आउटपुट एक बाइट सरणी होगा।
फिर हस्ताक्षर को आधार 64 एनरोल किया जाना चाहिए। हेडर, क्लेम सेट और सिग्नेचर को एक अवधि ( .
) वर्ण के साथ समेटा जाता है। परिणाम 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 को जेनरेट करने के बाद, एक एप्लिकेशन इसे एक्सेस टोकन का अनुरोध करने के लिए उपयोग कर सकता है। यह एक्सेस टोकन अनुरोध एक HTTPS POST
अनुरोध है, और निकाय URL एन्कोडेड है। URL नीचे दिखाया गया है:
https://oauth2.googleapis.com/token
निम्नलिखित पैरामीटर HTTPS POST
अनुरोध में आवश्यक हैं:
नाम | विवरण |
---|---|
grant_type | निम्नलिखित स्ट्रिंग, URL-एनकोडेड का उपयोग आवश्यक के रूप में करें: urn:ietf:params:oauth:grant-type:jwt-bearer |
assertion | JWT, हस्ताक्षर सहित। |
नीचे पहुँच अनुरोध में 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 को कॉल करना
जावा
निम्न चरणों को पूरा करके Google API को कॉल करने के लिए GoogleCredential
ऑब्जेक्ट का उपयोग करें:
- उस API के लिए एक सेवा ऑब्जेक्ट बनाएं जिसे आप
GoogleCredential
ऑब्जेक्ट का उपयोग करके कॉल करना चाहते हैं। उदाहरण के लिए:SQLAdmin sqladmin = new SQLAdmin.Builder(httpTransport, JSON_FACTORY, credential).build();
- सेवा ऑब्जेक्ट द्वारा दिए गए इंटरफ़ेस का उपयोग करके एपीआई सेवा के लिए अनुरोध करें। उदाहरण के लिए, रोमांचक-उदाहरण -123 परियोजना में क्लाउड SQL डेटाबेस के उदाहरणों को सूचीबद्ध करने के लिए:
SQLAdmin.Instances.List instances = sqladmin.instances().list("exciting-example-123").execute();
अजगर
Google API को निम्न चरणों को पूरा करने के लिए अधिकृत Credentials
ऑब्जेक्ट का उपयोग करें:
- एपीआई के लिए एक सेवा ऑब्जेक्ट बनाएँ जिसे आप कॉल करना चाहते हैं। आप एपीआई और अधिकृत
Credentials
ऑब्जेक्ट के नाम और संस्करण के साथbuild
फ़ंक्शन को कॉल करके एए सेवा ऑब्जेक्ट काbuild
करते हैं। उदाहरण के लिए, क्लाउड SQL प्रशासन API के संस्करण 1beta3 को कॉल करने के लिए:import googleapiclient.discovery sqladmin = googleapiclient.discovery.build('sqladmin', 'v1beta3', credentials=credentials)
- सेवा ऑब्जेक्ट द्वारा दिए गए इंटरफ़ेस का उपयोग करके एपीआई सेवा के लिए अनुरोध करें। उदाहरण के लिए, रोमांचक-उदाहरण -123 परियोजना में क्लाउड SQL डेटाबेस के उदाहरणों को सूचीबद्ध करने के लिए:
response = sqladmin.instances().list(project='exciting-example-123').execute()
HTTP / REST
यदि आपका एप्लिकेशन एक्सेस टोकन प्राप्त करता है, तो आप किसी दिए गए सेवा खाते या उपयोगकर्ता खाते की ओर से Google API पर कॉल करने के लिए टोकन का उपयोग कर सकते हैं यदि एपीआई द्वारा आवश्यक एक्सेस का स्कोप प्रदान किया गया हो। ऐसा करने के लिए, API के अनुरोध में एक्सेस टोकन को या तो एक access_token
क्वेरी पैरामीटर या एक Authorization
HTTP हेडर Bearer
मान शामिल करके शामिल करें। जब संभव हो, HTTP हेडर बेहतर होता है, क्योंकि क्वेरी लॉग सर्वर लॉग में दिखाई देते हैं। ज्यादातर मामलों में आप Google API के लिए अपनी कॉल सेट करने के लिए क्लाइंट लाइब्रेरी का उपयोग कर सकते हैं (उदाहरण के लिए, ड्राइव फाइल एपीआई को कॉल करते समय)।
आप सभी Google API को आज़मा सकते हैं और OAuth 2.0 प्लेग्राउंड में उनके स्कोप देख सकते हैं।
HTTP GET के उदाहरण हैं
Authorization: Bearer
का उपयोग करके drive.files
एंडपॉइंट (ड्राइव फाइल एपीआई) पर कॉल Authorization: Bearer
HTTP हेडर निम्नलिखित की तरह लग सकता है। ध्यान दें कि आपको अपना स्वयं का टोकन निर्दिष्ट करने की आवश्यकता है:
GET /drive/v2/files HTTP/1.1 Host: www.googleapis.com Authorization: Bearer access_token
यहाँ access_token
क्वेरी स्ट्रिंग पैरामीटर का उपयोग करके प्रमाणित उपयोगकर्ता के लिए उसी API के लिए एक कॉल है:
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
या, वैकल्पिक रूप से, क्वेरी स्ट्रिंग पैरामीटर विकल्प:
0a195cbb0जब पहुंच टोकन समाप्त हो जाती है
पहुँच गूगल OAuth 2.0 प्राधिकरण सर्वर द्वारा जारी किए गए टोकन द्वारा प्रदान की अवधि के बाद समाप्त हो expires_in
मूल्य। जब एक एक्सेस टोकन समाप्त हो जाता है, तो एप्लिकेशन को एक और JWT उत्पन्न करना चाहिए, उस पर हस्ताक्षर करना चाहिए, और दूसरे एक्सेस टोकन के लिए अनुरोध करना चाहिए।
JWT त्रुटि कोड
error क्षेत्र | error_description फ़ील्ड | जिसका अर्थ है | कैसे करें समाधान |
---|---|---|---|
unauthorized_client | Unauthorized client or scope in request. | यदि आप डोमेन-वाइड प्रतिनिधि का उपयोग करने का प्रयास कर रहे हैं, तो सेवा खाता उपयोगकर्ता के डोमेन के व्यवस्थापक कंसोल में अधिकृत नहीं है। | सुनिश्चित करें कि हालांकि आमतौर पर इसमें कुछ मिनट लगते हैं, लेकिन आपके Google खाते में सभी उपयोगकर्ताओं को प्रचारित करने में प्राधिकरण को 24 घंटे तक का समय लग सकता है। |
unauthorized_client | Client is unauthorized to retrieve access tokens using this method, or client not authorized for any of the scopes requested. | व्यवस्थापक कंसोल में क्लाइंट ID (संख्यात्मक) के बजाय क्लाइंट ईमेल पते का उपयोग करके एक सेवा खाता अधिकृत किया गया था। | व्यवस्थापक कंसोल में डोमेन-वाइड प्रतिनिधि पृष्ठ में, क्लाइंट को निकालें, और इसे संख्यात्मक आईडी के साथ फिर से जोड़ें। |
access_denied | (कोई मान) | यदि आप डोमेन-वाइड प्रतिनिधि का उपयोग कर रहे हैं, तो व्यवस्थापक कंसोल में एक या अधिक अनुरोधित स्कोप अधिकृत नहीं हैं। | सुनिश्चित करें कि हालांकि आमतौर पर कुछ मिनट लगते हैं, आपके Google खाते में सभी उपयोगकर्ताओं को प्रचारित करने में प्राधिकरण को 24 घंटे तक का समय लग सकता है। |
invalid_grant | Not a valid email. | उपयोगकर्ता मौजूद नहीं है। | जांचें कि sub दावे (क्षेत्र) में ईमेल पता सही है। |
invalid_grant | | आमतौर पर, इसका मतलब है कि स्थानीय प्रणाली का समय सही नहीं है। यह भी हो सकता है अगर exp मूल्य से भविष्य में अधिक से अधिक 65 मिनट है iat मूल्य, या 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. | किसी भी स्कोप का अनुरोध नहीं किया गया था (स्कोप की खाली सूची), या अनुरोधित स्कोप में से कोई मौजूद नहीं है (अर्थात अमान्य है)। | सुनिश्चित करें कि JWT का ध्यान दें कि |
disabled_client | The OAuth client was disabled. | JWT अभिकथन पर हस्ताक्षर करने के लिए उपयोग की जाने वाली कुंजी अक्षम है। | Google API Console पर जाएं, और IAM और व्यवस्थापक> सेवा खातों के तहत, सेवा खाते को सक्षम करें जिसमें "कुंजी आईडी" शामिल है जिसका उपयोग हस्ताक्षर करने के लिए किया गया है। |
परिशिष्ट: OAuth के बिना सेवा खाता प्राधिकरण
कुछ Google API के साथ, आप OAuth 2.0 एक्सेस टोकन की बजाय सीधे एक हस्ताक्षरित JWT का उपयोग करके एक अधिकृत JWT का उपयोग करके अधिकृत API कॉल कर सकते हैं। जब यह संभव है, तो आप एपीआई कॉल करने से पहले Google के प्राधिकरण सर्वर से नेटवर्क अनुरोध करने से बच सकते हैं।
यदि आप जिस API को कॉल करना चाहते हैं, उसकी Google API GitHub रिपॉजिटरी में प्रकाशित एक सेवा परिभाषा है , तो आप एक्सेस टोकन के बजाय JWT का उपयोग करके अधिकृत API कॉल कर सकते हैं। ऐसा करने के लिए:
- जैसा कि ऊपर बताया गया है, एक सेवा खाता बनाएँ । जब आप खाता बनाते हैं तो JSON फाइल रखना सुनिश्चित करें।
- किसी भी मानक 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
फ़ील्ड के लिए, API समापन बिंदु निर्दिष्ट करें। उदाहरण के लिए:https:// SERVICE .googleapis.com/
। -
iat
फ़ील्ड के लिए, वर्तमान यूनिक्स समय निर्दिष्ट करें, औरexp
फ़ील्ड के लिए, ठीक 3600 सेकंड बाद का समय निर्दिष्ट करें, जब JWT समाप्त हो जाएगा।
अपने सेवा खाते JSON फ़ाइल में मिली निजी कुंजी का उपयोग करके RSA-256 के साथ JWT पर हस्ताक्षर करें।
उदाहरण के लिए:
जावा
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 ...
अजगर
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')
- एपीआई JWT को वाहक टोकन के रूप में उपयोग करके एपीआई को कॉल करें:
GET /v1/projects/abc/databases/123/indexes HTTP/1.1 Authorization: Bearer SIGNED_JWT Host: firestore.googleapis.com