इस दस्तावेज़ में बताया गया है कि वेब सर्वर ऐप्लिकेशन, Google API क्लाइंट लाइब्रेरी या Google OAuth 2.0 एंडपॉइंट का इस्तेमाल कैसे करते हैं, ताकि Google API को ऐक्सेस करने के लिए, OAuth 2.0 की अनुमति को लागू किया जा सके.
OAuth 2.0, उपयोगकर्ताओं को अपने उपयोगकर्ता नाम, पासवर्ड, और दूसरी जानकारी को निजी रखते हुए, किसी ऐप्लिकेशन के साथ खास डेटा शेयर करने की सुविधा देता है. उदाहरण के लिए, कोई ऐप्लिकेशन OAuth 2.0 का इस्तेमाल करके, उपयोगकर्ताओं से अपनी Google Drive में फ़ाइलें सेव करने की अनुमति ले सकता है.
यह OAuth 2.0 फ़्लो, खास तौर पर उपयोगकर्ता की अनुमति देने के लिए है. इसे ऐसे ऐप्लिकेशन के लिए डिज़ाइन किया गया है जो गोपनीय जानकारी सेव कर सकते हैं और स्थिति को बरकरार रख सकते हैं. जब उपयोगकर्ता ऐप्लिकेशन से इंटरैक्ट करता है या उपयोगकर्ता ऐप्लिकेशन छोड़ देता है, तब सही तरीके से अनुमति वाला वेब सर्वर ऐप्लिकेशन एपीआई को ऐक्सेस कर सकता है.
एपीआई अनुरोधों को अनुमति देने के लिए, वेब सर्वर ऐप्लिकेशन अक्सर सेवा खातों का इस्तेमाल करते हैं. खास तौर पर, ऐसा तब होता है, जब उपयोगकर्ता के डेटा के बजाय, प्रोजेक्ट-आधारित डेटा को ऐक्सेस करने के लिए Cloud API को कॉल किया जाता है. वेब सर्वर ऐप्लिकेशन, उपयोगकर्ता की अनुमति के साथ सेवा खातों का इस्तेमाल कर सकते हैं.
क्लाइंट लाइब्रेरी
इस पेज पर भाषा के हिसाब से दिए गए उदाहरणों में, OAuth 2.0 की अनुमति देने की प्रक्रिया को लागू करने के लिए, Google API क्लाइंट लाइब्रेरी का इस्तेमाल किया गया है. कोड के सैंपल चलाने के लिए, आपको पहले अपनी भाषा की क्लाइंट लाइब्रेरी इंस्टॉल करनी होगी.
जब ऐप्लिकेशन के OAuth 2.0 फ़्लो को हैंडल करने के लिए, Google API क्लाइंट लाइब्रेरी का इस्तेमाल किया जाता है, तो क्लाइंट लाइब्रेरी ऐसी कई कार्रवाइयां करती है जिन्हें ऐप्लिकेशन को खुद मैनेज करना पड़ता. उदाहरण के लिए, इससे यह तय होता है कि ऐप्लिकेशन, स्टोर किए गए ऐक्सेस टोकन का इस्तेमाल कब कर सकता है या उसे कब रीफ़्रेश कर सकता है. साथ ही, इससे यह भी तय होता है कि ऐप्लिकेशन को सहमति कब लेनी होगी. क्लाइंट लाइब्रेरी, सही रीडायरेक्ट यूआरएल भी जनरेट करती है. साथ ही, यह ऐसे रीडायरेक्ट हैंडलर लागू करने में मदद करती है जो ऐक्सेस टोकन के लिए ऑथराइज़ेशन कोड का लेन-देन करते हैं.
सर्वर-साइड के ऐप्लिकेशन के लिए Google API क्लाइंट लाइब्रेरी, यहां दी गई भाषाओं में उपलब्ध हैं:
ज़रूरी शर्तें
अपने प्रोजेक्ट के लिए एपीआई चालू करें
जो ऐप्लिकेशन Google API को कॉल करता है उसे उन एपीआई को API Consoleमें चालू करना होगा.
अपने प्रोजेक्ट के लिए एपीआई चालू करने के लिए:
- Google API Console मेंOpen the API Library .
- If prompted, select a project, or create a new one.
- API Library में, प्रॉडक्ट फ़ैमिली और लोकप्रियता के हिसाब से, सभी उपलब्ध एपीआई की सूची होती है. आपको जिस एपीआई को चालू करना है, अगर वह सूची में नहीं दिख रहा है, तो उसे ढूंढने के लिए खोजें का इस्तेमाल करें. इसके अलावा, उस प्रॉडक्ट फ़ैमिली में सभी देखें पर क्लिक करें जिससे यह जुड़ा है.
- वह एपीआई चुनें जिसे आपको चालू करना है. इसके बाद, चालू करें बटन पर क्लिक करें.
- If prompted, enable billing.
- If prompted, read and accept the API's Terms of Service.
अनुमति देने वाले क्रेडेंशियल बनाएं
Google API को ऐक्सेस करने के लिए OAuth 2.0 का इस्तेमाल करने वाले किसी भी ऐप्लिकेशन के पास ऐसे अनुमति क्रेडेंशियल होने चाहिए जो Google के OAuth 2.0 सर्वर पर ऐप्लिकेशन की पहचान कर सकें. अपने प्रोजेक्ट के लिए क्रेडेंशियल बनाने का तरीका यहां बताया गया है. इसके बाद, आपके ऐप्लिकेशन उन एपीआई को ऐक्सेस करने के लिए क्रेडेंशियल का इस्तेमाल कर सकते हैं जिन्हें आपने उस प्रोजेक्ट के लिए चालू किया है.
- Go to the Credentials page.
- क्रेडेंशियल बनाएं > OAuth क्लाइंट आईडी पर क्लिक करें.
- वेब ऐप्लिकेशन ऐप्लिकेशन का टाइप चुनें.
- फ़ॉर्म भरें और बनाएं पर क्लिक करें. PHP, Java, Python, Ruby, और .NET जैसी भाषाओं और फ़्रेमवर्क का इस्तेमाल करने वाले ऐप्लिकेशन को, अनुमति वाले रीडायरेक्ट यूआरआई तय करने होंगे. रीडायरेक्ट यूआरआई ऐसे एंडपॉइंट होते हैं जिन पर OAuth 2.0 सर्वर जवाब भेज सकता है. इन
एंडपॉइंट को पुष्टि करने के लिए, Google के नियमों का पालन करना होगा.
जांच के लिए, लोकल मशीन से जुड़े यूआरआई तय किए जा सकते हैं, जैसे कि
http://localhost:8080
. इसे ध्यान में रखते हुए, कृपया ध्यान दें कि इस दस्तावेज़ में दिए गए सभी उदाहरणों में,http://localhost:8080
को रीडायरेक्ट यूआरआई के तौर पर इस्तेमाल किया गया है.हमारा सुझाव है कि आप अपने ऐप्लिकेशन के लिए, पुष्टि करने के एंडपॉइंट डिज़ाइन करें, ताकि आपका ऐप्लिकेशन, पेज पर मौजूद अन्य संसाधनों को ऑथराइज़ेशन कोड न दिखे.
अपने क्रेडेंशियल बनाने के बाद, API Consoleसे client_secret.json फ़ाइल डाउनलोड करें. फ़ाइल को ऐसी जगह पर सुरक्षित तरीके से सेव करें जहां सिर्फ़ आपका ऐप्लिकेशन ऐक्सेस कर सके.
ऐक्सेस के दायरे की पहचान करना
दायरे की मदद से, आपका ऐप्लिकेशन सिर्फ़ उन संसाधनों के ऐक्सेस का अनुरोध कर सकता है जिनकी उसे ज़रूरत है. साथ ही, उपयोगकर्ताओं को यह कंट्रोल करने की सुविधा भी मिलती है कि वे आपके ऐप्लिकेशन को कितने ऐक्सेस दें. इसलिए, अनुरोध किए गए दायरों की संख्या और उपयोगकर्ता की सहमति लेने की संभावना के बीच अंतर हो सकता है.
OAuth 2.0 की मदद से अनुमति देने की प्रक्रिया शुरू करने से पहले, हमारा सुझाव है कि आप ऐसे दायरों की पहचान कर लें जिन्हें ऐक्सेस करने के लिए आपके ऐप्लिकेशन को अनुमति की ज़रूरत होगी.
हमारा यह भी सुझाव है कि आपका ऐप्लिकेशन, इंक्रीमेंटल ऑथराइज़ेशन प्रोसेस के ज़रिए, अनुमति देने के दायरे के ऐक्सेस का अनुरोध करे. इस प्रोसेस के दौरान, आपका ऐप्लिकेशन, उपयोगकर्ता के डेटा के ऐक्सेस का अनुरोध करता है. इससे उपयोगकर्ताओं को आसानी से यह समझने में मदद मिलती है कि आपके ऐप्लिकेशन को जिस ऐक्सेस का अनुरोध किया जा रहा है उसे ऐक्सेस की ज़रूरत क्यों है.
OAuth 2.0 API स्कोप दस्तावेज़ में उन दायरों की पूरी सूची है जिनका इस्तेमाल आप Google API को ऐक्सेस करने के लिए कर सकते हैं.
भाषा के हिसाब से ज़रूरी शर्तें
इस दस्तावेज़ में मौजूद किसी भी कोड सैंपल को चलाने के लिए, आपके पास एक Google खाता, इंटरनेट का ऐक्सेस, और एक वेब ब्राउज़र होना चाहिए. अगर एपीआई क्लाइंट लाइब्रेरी में से किसी एक का इस्तेमाल किया जा रहा है, तो भाषा के हिसाब से ज़रूरी शर्तें नीचे देखें.
PHP
इस दस्तावेज़ में PHP कोड के नमूने चलाने के लिए, आपको इनकी ज़रूरत होगी:
- कमांड-लाइन इंटरफ़ेस (सीएलआई) और इंस्टॉल किए गए JSON एक्सटेंशन के साथ, PHP 5.6 या उससे ज़्यादा वर्शन.
- कंपोज़र डिपेंडेंसी मैनेजमेंट टूल.
-
PHP के लिए Google API क्लाइंट लाइब्रेरी:
composer require google/apiclient:^2.10
Python
इस दस्तावेज़ में Python कोड सैंपल चलाने के लिए, आपको इनकी ज़रूरत होगी:
- Python 2.6 या इससे नया वर्शन
- pip पैकेज मैनेज करने वाला टूल.
- Python के लिए Google API क्लाइंट लाइब्रेरी:
pip install --upgrade google-api-python-client
- उपयोगकर्ता की अनुमति के लिए
google-auth
,google-auth-oauthlib
, औरgoogle-auth-httplib2
.pip install --upgrade google-auth google-auth-oauthlib google-auth-httplib2
- Blask Python वेब ऐप्लिकेशन फ़्रेमवर्क.
pip install --upgrade flask
requests
एचटीटीपी लाइब्रेरी.pip install --upgrade requests
Ruby
इस दस्तावेज़ में Ruby कोड के सैंपल चलाने के लिए, आपको इनकी ज़रूरत होगी:
- Ruby 2.6 या उसके बाद का वर्शन
-
Ruby के लिए Google Auth लाइब्रेरी:
gem install googleauth
-
Sinatra Ruby वेब ऐप्लिकेशन फ़्रेमवर्क.
gem install sinatra
Node.js
इस दस्तावेज़ में Node.js कोड सैंपल चलाने के लिए, आपको इनकी ज़रूरत होगी:
- रखरखाव एलटीएस, चालू एलटीएस या Node.js की मौजूदा रिलीज़.
-
Google API Node.js क्लाइंट:
npm install googleapis
एचटीटीपी/REST
OAuth 2.0 एंडपॉइंट को सीधे तौर पर कॉल करने के लिए, आपको कोई लाइब्रेरी इंस्टॉल करने की ज़रूरत नहीं है.
OAuth 2.0 ऐक्सेस टोकन पाना
नीचे दिए गए तरीके से पता चलता है कि उपयोगकर्ता की ओर से एपीआई अनुरोध करने के लिए, उपयोगकर्ता की सहमति लेने के लिए, आपका ऐप्लिकेशन किस तरह Google के OAuth 2.0 सर्वर के साथ इंटरैक्ट करता है. आपके ऐप्लिकेशन के पास वह सहमति होनी चाहिए, उसके बाद ही वह Google API अनुरोध पर कार्रवाई कर सकता है जिसके लिए उपयोगकर्ता की अनुमति की ज़रूरत होती है.
नीचे दी गई सूची में इन चरणों के बारे में खास जानकारी दी गई है:
- आपका ऐप्लिकेशन उन अनुमतियों की पहचान करता है जिनकी उसे ज़रूरत है.
- आपका ऐप्लिकेशन, अनुरोध की गई अनुमतियों की सूची के साथ लोगों को Google पर रीडायरेक्ट करता है.
- उपयोगकर्ता तय करता है कि आपके ऐप्लिकेशन को अनुमतियां देनी हैं या नहीं.
- आपका ऐप्लिकेशन यह पता लगाता है कि उपयोगकर्ता ने क्या फ़ैसला लिया था.
- अगर उपयोगकर्ता ने अनुरोध की गई अनुमतियां दी हैं, तो आपका ऐप्लिकेशन, उपयोगकर्ता की ओर से एपीआई अनुरोध करने के लिए ज़रूरी टोकन इकट्ठा करता है.
पहला चरण: अनुमति देने वाले पैरामीटर सेट करना
आपका पहला चरण, अनुमति देने का अनुरोध करना है. वह अनुरोध ऐसे पैरामीटर सेट करता है जो आपके ऐप्लिकेशन की पहचान करते हैं और वे अनुमतियां तय करते हैं जो उपयोगकर्ता से आपके ऐप्लिकेशन को देने के लिए कहा जाएगा.
- अगर OAuth 2.0 की पुष्टि करने और अनुमति देने के लिए Google क्लाइंट लाइब्रेरी का इस्तेमाल किया जाता है, तो आपको इन पैरामीटर को तय करने वाला ऑब्जेक्ट बनाना और कॉन्फ़िगर करना होगा.
- Google OAuth 2.0 एंडपॉइंट को सीधे कॉल करने पर, आपको एक यूआरएल जनरेट करना होगा और उस यूआरएल पर पैरामीटर सेट करने होंगे.
नीचे दिए गए टैब, वेब सर्वर ऐप्लिकेशन के लिए काम करने वाले अनुमति पैरामीटर तय करते हैं. भाषा के हिसाब से दिए गए उदाहरण में, यह भी बताया गया है कि किसी ऑब्जेक्ट को क्लाइंट लाइब्रेरी या ऑथराइज़ेशन लाइब्रेरी का इस्तेमाल करके, उन पैरामीटर को सेट करने वाले ऑब्जेक्ट को कैसे कॉन्फ़िगर किया जाए.
PHP
नीचे दिया गया कोड स्निपेट एक Google\Client()
ऑब्जेक्ट बनाता है, जो
अनुमति देने के अनुरोध में पैरामीटर तय करता है.
वह ऑब्जेक्ट आपके ऐप्लिकेशन की पहचान करने के लिए, आपकी client_secret.json फ़ाइल में मौजूद जानकारी का इस्तेमाल करता है. उस फ़ाइल के बारे में ज़्यादा जानने के लिए, अनुमति देने वाले क्रेडेंशियल बनाना देखें. ऑब्जेक्ट उन दायरों की भी पहचान करता है जिन्हें आपका ऐप्लिकेशन ऐक्सेस करने की अनुमति
मांग रहा है. साथ ही, यह आपके ऐप्लिकेशन के ऑथराइज़ेशन एंडपॉइंट का यूआरएल भी बताता है, जो
Google के OAuth 2.0 सर्वर से मिलने वाले रिस्पॉन्स को मैनेज करेगा. आखिर में, कोड, वैकल्पिक access_type
और
include_granted_scopes
पैरामीटर सेट करता है.
उदाहरण के लिए, यह कोड किसी उपयोगकर्ता की Google Drive का रीड-ओनली, ऑफ़लाइन ऐक्सेस मांगता है:
$client = new Google\Client(); $client->setAuthConfig('client_secret.json'); $client->addScope(Google\Service\Drive::DRIVE_METADATA_READONLY); $client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php'); // offline access will give you both an access and refresh token so that // your app can refresh the access token without user interaction. $client->setAccessType('offline'); // Using "consent" will prompt the user for consent $client->setPrompt('consent'); $client->setIncludeGrantedScopes(true); // incremental auth
अनुरोध में यह जानकारी शामिल होती है:
पैरामीटर | |||||||
---|---|---|---|---|---|---|---|
client_id |
ज़रूरी
आपके ऐप्लिकेशन का क्लाइंट आईडी. यह वैल्यू API Console Credentials pageमें देखी जा सकती है. PHP में, client_secret.json फ़ाइल से अनुमति देने के क्रेडेंशियल लोड
करने के लिए, $client = new Google\Client(); $client->setAuthConfig('client_secret.json'); |
||||||
redirect_uri |
ज़रूरी
यह तय करता है कि उपयोगकर्ता के ऑथराइज़ेशन फ़्लो को पूरा करने के बाद, एपीआई सर्वर उपयोगकर्ता को
कहां रीडायरेक्ट करता है. यह वैल्यू, OAuth 2.0 क्लाइंट के लिए अनुमति वाले उस रीडायरेक्ट यूआरआई में से
किसी एक से पूरी तरह मेल खानी चाहिए जिसे आपने अपने क्लाइंट के
API Console
Credentials pageमें कॉन्फ़िगर किया है. अगर यह वैल्यू, दिए गए ध्यान दें कि इस वैल्यू को PHP में सेट करने के लिए, $client->setRedirectUri('https://oauth2.example.com/code'); |
||||||
scope |
ज़रूरी
स्कोप की ऐसी सूची जिन्हें अलग-अलग फ़ॉर्मैट में इस्तेमाल किया जा सकता है. इससे उन संसाधनों की पहचान होती है जिन्हें आपका ऐप्लिकेशन, उपयोगकर्ता की ओर से ऐक्सेस कर सकता है. ये वैल्यू उस स्क्रीन के बारे में जानकारी देती हैं जो Google को सहमति वाली स्क्रीन पर दिखता है. दायरे की मदद से, आपका ऐप्लिकेशन सिर्फ़ उन संसाधनों के ऐक्सेस का अनुरोध कर सकता है जिनकी उसे ज़रूरत है. साथ ही, इससे उपयोगकर्ता यह कंट्रोल कर सकते हैं कि वे आपके ऐप्लिकेशन को कितने ऐक्सेस दें. इसलिए, अनुरोध किए गए दायरों की संख्या और उपयोगकर्ता की सहमति लेने की संभावना के बीच काफ़ी अंतर होता है. इस वैल्यू को PHP में सेट करने के लिए, $client->addScope(Google\Service\Drive::DRIVE_METADATA_READONLY); हमारा सुझाव है कि जब भी मुमकिन हो, तब अपने ऐप्लिकेशन से अनुमति वाले दायरे के ऐक्सेस का अनुरोध करें. इंक्रीमेंटल अनुमति से, उपयोगकर्ता के डेटा का ऐक्सेस पाने के लिए अनुरोध करने से, उपयोगकर्ताओं को यह समझने में आसानी होती है कि आपके ऐप्लिकेशन को डेटा ऐक्सेस करने की अनुमति क्यों चाहिए. |
||||||
access_type |
सुझाया गया
इससे यह पता चलता है कि उपयोगकर्ता के ब्राउज़र पर मौजूद न होने पर, आपका ऐप्लिकेशन ऐक्सेस टोकन को रीफ़्रेश कर सकता है या नहीं. पैरामीटर की मान्य वैल्यू अगर आपके ऐप्लिकेशन को ऐक्सेस टोकन रीफ़्रेश करने की ज़रूरत है, तो उपयोगकर्ता के ब्राउज़र पर मौजूद न होने पर,
वैल्यू को इस वैल्यू को PHP में सेट करने के लिए, $client->setAccessType('offline'); |
||||||
state |
सुझाया गया
इससे ऐसी स्ट्रिंग की वैल्यू के बारे में पता चलता है जिसका इस्तेमाल आपका ऐप्लिकेशन, अनुमति देने के आपके अनुरोध और अनुमति देने वाले सर्वर के रिस्पॉन्स के बीच की स्थिति बनाए रखने के लिए करता है.
सर्वर, वही वैल्यू दिखाता है जो आपने
इस पैरामीटर का इस्तेमाल कई कामों के लिए किया जा सकता है. जैसे, उपयोगकर्ता को अपने ऐप्लिकेशन में
सही संसाधन पर ले जाना, नॉन्स भेजना, और दूसरी साइट से किए जाने वाले अनुरोधों की
जालसाज़ी को कम करना. आपके इस वैल्यू को PHP में सेट करने के लिए, $client->setState($sample_passthrough_value); |
||||||
include_granted_scopes |
ज़रूरी नहीं
इससे ऐप्लिकेशन को कॉन्टेक्स्ट के हिसाब से, ज़्यादा दायरे के ऐक्सेस का अनुरोध करने के लिए, इंक्रीमेंटल अनुमति का इस्तेमाल करने की सुविधा मिलती है. अगर इस पैरामीटर की वैल्यू को इस वैल्यू को PHP में सेट करने के लिए, $client->setIncludeGrantedScopes(true); |
||||||
enable_granular_consent |
ज़रूरी नहीं
डिफ़ॉल्ट तौर पर, यह वैल्यू |
||||||
login_hint |
ज़रूरी नहीं
अगर आपके ऐप्लिकेशन को पता है कि कौनसा उपयोगकर्ता पुष्टि करने की कोशिश कर रहा है, तो वह Google के पुष्टि करने वाले सर्वर को संकेत देने के लिए इस पैरामीटर का इस्तेमाल कर सकता है. सर्वर, लॉगिन फ़्लो को आसान बनाने के लिए संकेत का इस्तेमाल करता है. इसके लिए, साइन-इन फ़ॉर्म में ईमेल फ़ील्ड में जानकारी पहले से भरी होती है या एक से ज़्यादा लॉगिन वाले सही सेशन को चुना जाता है. पैरामीटर वैल्यू को ईमेल पते या इस वैल्यू को PHP में सेट करने के लिए, $client->setLoginHint('None'); |
||||||
prompt |
ज़रूरी नहीं
लोगों को दिखाने के लिए, प्रॉम्प्ट की ऐसी सूची जिसमें स्पेस को अलग-अलग जगह दी गई हो और जिसमें केस-सेंसिटिव (बड़े और छोटे अक्षरों में अंतर) हों. अगर इस पैरामीटर का इस्तेमाल नहीं किया जाता, तो उपयोगकर्ता को सिर्फ़ पहली बार आपके प्रोजेक्ट से ऐक्सेस का अनुरोध करने पर सूचना मिलेगी. ज़्यादा जानकारी के लिए, फिर से सहमति देना देखें. इस वैल्यू को PHP में सेट करने के लिए, $client->setPrompt('consent'); आपको ये वैल्यू दिख सकती हैं:
|
Python
अनुमति का अनुरोध करने के लिए, यह कोड स्निपेट google-auth-oauthlib.flow
मॉड्यूल
का इस्तेमाल करता है.
यह कोड एक Flow
ऑब्जेक्ट बनाता है, जो आपके ऐप्लिकेशन की पहचान करता है. इसके लिए, client_secret.json फ़ाइल में दी गई जानकारी का इस्तेमाल किया जाता है, जिसे आपने अनुमति देने के क्रेडेंशियल बनाने के बाद डाउनलोड किया था. वह ऑब्जेक्ट उन दायरों की भी पहचान करता है
जिन्हें ऐक्सेस करने की अनुमति आपका ऐप्लिकेशन मांग रहा है. साथ ही, यह आपके ऐप्लिकेशन के
पुष्टि करने वाले एंडपॉइंट का यूआरएल भी बताता है, जो Google के OAuth 2.0 सर्वर से मिलने वाले रिस्पॉन्स को मैनेज करेगा. आखिर में, कोड
वैकल्पिक access_type
और include_granted_scopes
पैरामीटर सेट करता है.
उदाहरण के लिए, यह कोड किसी उपयोगकर्ता की Google Drive का रीड-ओनली, ऑफ़लाइन ऐक्सेस मांगता है:
import google.oauth2.credentials import google_auth_oauthlib.flow # Use the client_secret.json file to identify the application requesting # authorization. The client ID (from that file) and access scopes are required. flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file( 'client_secret.json', scopes=['https://www.googleapis.com/auth/drive.metadata.readonly']) # Indicate where the API server will redirect the user after the user completes # the authorization flow. The redirect URI is required. The value must exactly # match one of the authorized redirect URIs for the OAuth 2.0 client, which you # configured in the API Console. If this value doesn't match an authorized URI, # you will get a 'redirect_uri_mismatch' error. flow.redirect_uri = 'https://www.example.com/oauth2callback' # Generate URL for request to Google's OAuth 2.0 server. # Use kwargs to set optional request parameters. authorization_url, state = flow.authorization_url( # Enable offline access so that you can refresh an access token without # re-prompting the user for permission. Recommended for web server apps. access_type='offline', # Enable incremental authorization. Recommended as a best practice. include_granted_scopes='true')
अनुरोध में यह जानकारी शामिल होती है:
पैरामीटर | |||||||
---|---|---|---|---|---|---|---|
client_id |
ज़रूरी
आपके ऐप्लिकेशन का क्लाइंट आईडी. यह वैल्यू API Console Credentials pageमें देखी जा सकती है. Python में, client_secret.json फ़ाइल से क्लाइंट आईडी फिर से पाने के लिए, flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file( 'client_secret.json', scopes=['https://www.googleapis.com/auth/drive.metadata.readonly']) |
||||||
redirect_uri |
ज़रूरी
यह तय करता है कि उपयोगकर्ता के ऑथराइज़ेशन फ़्लो को पूरा करने के बाद, एपीआई सर्वर उपयोगकर्ता को
कहां रीडायरेक्ट करता है. यह वैल्यू, OAuth 2.0 क्लाइंट के लिए अनुमति वाले उस रीडायरेक्ट यूआरआई में से
किसी एक से पूरी तरह मेल खानी चाहिए जिसे आपने अपने क्लाइंट के
API Console
Credentials pageमें कॉन्फ़िगर किया है. अगर यह वैल्यू, दिए गए ध्यान दें कि इस वैल्यू को Python में सेट करने के लिए, flow.redirect_uri = 'https://oauth2.example.com/code' |
||||||
scope |
ज़रूरी
उन दायरों की सूची जो उन संसाधनों की पहचान करते हैं जिन्हें आपका ऐप्लिकेशन, उपयोगकर्ता की ओर से ऐक्सेस कर सकता है. ये वैल्यू उस स्क्रीन के बारे में जानकारी देती हैं जो Google को सहमति वाली स्क्रीन पर दिखता है. दायरे की मदद से, आपका ऐप्लिकेशन सिर्फ़ उन संसाधनों के ऐक्सेस का अनुरोध कर सकता है जिनकी उसे ज़रूरत है. साथ ही, इससे उपयोगकर्ता यह कंट्रोल कर सकते हैं कि वे आपके ऐप्लिकेशन को कितने ऐक्सेस दें. इसलिए, अनुरोध किए गए दायरों की संख्या और उपयोगकर्ता की सहमति लेने की संभावना के बीच काफ़ी अंतर होता है. Python में, स्कोप की सूची तय करने के लिए, उसी तरीके का इस्तेमाल करें जिसका इस्तेमाल
flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file( 'client_secret.json', scopes=['https://www.googleapis.com/auth/drive.metadata.readonly']) हमारा सुझाव है कि जब भी मुमकिन हो, तब अपने ऐप्लिकेशन से अनुमति वाले दायरे के ऐक्सेस का अनुरोध करें. इंक्रीमेंटल अनुमति से, उपयोगकर्ता के डेटा का ऐक्सेस पाने के लिए अनुरोध करने से, उपयोगकर्ताओं को यह समझने में आसानी होती है कि आपके ऐप्लिकेशन को डेटा ऐक्सेस करने की अनुमति क्यों चाहिए. |
||||||
access_type |
सुझाया गया
इससे यह पता चलता है कि उपयोगकर्ता के ब्राउज़र पर मौजूद न होने पर, आपका ऐप्लिकेशन ऐक्सेस टोकन को रीफ़्रेश कर सकता है या नहीं. पैरामीटर की मान्य वैल्यू अगर आपके ऐप्लिकेशन को ऐक्सेस टोकन रीफ़्रेश करने की ज़रूरत है, तो उपयोगकर्ता के ब्राउज़र पर मौजूद न होने पर,
वैल्यू को Python में, authorization_url, state = flow.authorization_url( access_type='offline', include_granted_scopes='true') |
||||||
state |
सुझाया गया
इससे ऐसी स्ट्रिंग की वैल्यू के बारे में पता चलता है जिसका इस्तेमाल आपका ऐप्लिकेशन, अनुमति देने के आपके अनुरोध और अनुमति देने वाले सर्वर के रिस्पॉन्स के बीच की स्थिति बनाए रखने के लिए करता है.
सर्वर, वही वैल्यू दिखाता है जो आपने
इस पैरामीटर का इस्तेमाल कई कामों के लिए किया जा सकता है. जैसे, उपयोगकर्ता को अपने ऐप्लिकेशन में
सही संसाधन पर ले जाना, नॉन्स भेजना, और दूसरी साइट से किए जाने वाले अनुरोधों की
जालसाज़ी को कम करना. आपके Python में, authorization_url, state = flow.authorization_url( access_type='offline', state=sample_passthrough_value, include_granted_scopes='true') |
||||||
include_granted_scopes |
ज़रूरी नहीं
इससे ऐप्लिकेशन को कॉन्टेक्स्ट के हिसाब से, ज़्यादा दायरे के ऐक्सेस का अनुरोध करने के लिए, इंक्रीमेंटल अनुमति का इस्तेमाल करने की सुविधा मिलती है. अगर इस पैरामीटर की वैल्यू को Python में, authorization_url, state = flow.authorization_url( access_type='offline', include_granted_scopes='true') |
||||||
enable_granular_consent |
ज़रूरी नहीं
डिफ़ॉल्ट तौर पर, यह वैल्यू |
||||||
login_hint |
ज़रूरी नहीं
अगर आपके ऐप्लिकेशन को पता है कि कौनसा उपयोगकर्ता पुष्टि करने की कोशिश कर रहा है, तो वह Google के पुष्टि करने वाले सर्वर को संकेत देने के लिए इस पैरामीटर का इस्तेमाल कर सकता है. सर्वर, लॉगिन फ़्लो को आसान बनाने के लिए संकेत का इस्तेमाल करता है. इसके लिए, साइन-इन फ़ॉर्म में ईमेल फ़ील्ड में जानकारी पहले से भरी होती है या एक से ज़्यादा लॉगिन वाले सही सेशन को चुना जाता है. पैरामीटर वैल्यू को ईमेल पते या Python में, authorization_url, state = flow.authorization_url( access_type='offline', login_hint='None', include_granted_scopes='true') |
||||||
prompt |
ज़रूरी नहीं
लोगों को दिखाने के लिए, प्रॉम्प्ट की ऐसी सूची जिसमें स्पेस को अलग-अलग जगह दी गई हो और जिसमें केस-सेंसिटिव (बड़े और छोटे अक्षरों में अंतर) हों. अगर इस पैरामीटर का इस्तेमाल नहीं किया जाता, तो उपयोगकर्ता को सिर्फ़ पहली बार आपके प्रोजेक्ट से ऐक्सेस का अनुरोध करने पर सूचना मिलेगी. ज़्यादा जानकारी के लिए, फिर से सहमति देना देखें. Python में, authorization_url, state = flow.authorization_url( access_type='offline', prompt='consent', include_granted_scopes='true') आपको ये वैल्यू दिख सकती हैं:
|
Ruby
अपने ऐप्लिकेशन में किसी क्लाइंट ऑब्जेक्ट को कॉन्फ़िगर करने के लिए, आपने जिस client_secrets.json फ़ाइल को बनाया था उसका इस्तेमाल करें. किसी क्लाइंट ऑब्जेक्ट को कॉन्फ़िगर करते समय, आपको उन दायरों की जानकारी देनी होती है जिन्हें आपके ऐप्लिकेशन को ऐक्सेस करना ज़रूरी है. साथ ही, अपने ऐप्लिकेशन के ऑथराइज़ेशन एंडपॉइंट के यूआरएल की जानकारी भी देनी होती है, जो OAuth 2.0 सर्वर से मिलने वाले रिस्पॉन्स को हैंडल करेगा.
उदाहरण के लिए, यह कोड किसी उपयोगकर्ता की Google Drive का रीड-ओनली, ऑफ़लाइन ऐक्सेस मांगता है:
require 'google/apis/drive_v3' require "googleauth" require 'googleauth/stores/redis_token_store' client_id = Google::Auth::ClientId.from_file('/path/to/client_secret.json') scope = 'https://www.googleapis.com/auth/drive.metadata.readonly' token_store = Google::Auth::Stores::RedisTokenStore.new(redis: Redis.new) authorizer = Google::Auth::WebUserAuthorizer.new(client_id, scope, token_store, '/oauth2callback')Your application uses the client object to perform OAuth 2.0 operations, such as generating authorization request URLs and applying access tokens to HTTP requests.
Node.js
The code snippet below creates a google.auth.OAuth2
object, which defines the
parameters in the authorization request.
That object uses information from your client_secret.json file to identify your application. To ask for permissions from a user to retrieve an access token, you redirect them to a consent page. To create a consent page URL:
const {google} = require('googleapis'); /** * To use OAuth2 authentication, we need access to a CLIENT_ID, CLIENT_SECRET, AND REDIRECT_URI * from the client_secret.json file. To get these credentials for your application, visit * https://console.cloud.google.com/apis/credentials. */ const oauth2Client = new google.auth.OAuth2( YOUR_CLIENT_ID, YOUR_CLIENT_SECRET, YOUR_REDIRECT_URL ); // Access scopes for read-only Drive activity. const scopes = [ 'https://www.googleapis.com/auth/drive.metadata.readonly' ]; // Generate a url that asks permissions for the Drive activity scope const authorizationUrl = oauth2Client.generateAuthUrl({ // 'online' (default) or 'offline' (gets refresh_token) access_type: 'offline', /** Pass in the scopes array defined above. * Alternatively, if only one scope is needed, you can pass a scope URL as a string */ scope: scopes, // Enable incremental authorization. Recommended as a best practice. include_granted_scopes: true });
अहम जानकारी - पहली अनुमति मिलने पर ही refresh_token
वापस
किया जाता है. ज़्यादा जानकारी के लिए
यहां जाएं.
एचटीटीपी/REST
Google का OAuth 2.0 एंडपॉइंट https://accounts.google.com/o/oauth2/v2/auth
पर है. इस
एंडपॉइंट को सिर्फ़ एचटीटीपीएस पर ऐक्सेस किया जा सकता है. सामान्य एचटीटीपी कनेक्शन अस्वीकार किए गए हैं.
Google का ऑथराइज़ेशन सर्वर, वेब सर्वर ऐप्लिकेशन के लिए नीचे दिए गए क्वेरी स्ट्रिंग पैरामीटर के साथ काम करता है:
पैरामीटर | |||||||
---|---|---|---|---|---|---|---|
client_id |
ज़रूरी
आपके ऐप्लिकेशन का क्लाइंट आईडी. यह वैल्यू API Console Credentials pageमें देखी जा सकती है. |
||||||
redirect_uri |
ज़रूरी
यह तय करता है कि उपयोगकर्ता के ऑथराइज़ेशन फ़्लो को पूरा करने के बाद, एपीआई सर्वर उपयोगकर्ता को
कहां रीडायरेक्ट करता है. यह वैल्यू, OAuth 2.0 क्लाइंट के लिए अनुमति वाले उस रीडायरेक्ट यूआरआई में से
किसी एक से पूरी तरह मेल खानी चाहिए जिसे आपने अपने क्लाइंट के
API Console
Credentials pageमें कॉन्फ़िगर किया है. अगर यह वैल्यू, दिए गए ध्यान दें कि |
||||||
response_type |
ज़रूरी
तय करता है कि Google OAuth 2.0 एंडपॉइंट, ऑथराइज़ेशन कोड दिखाता है या नहीं. वेब सर्वर ऐप्लिकेशन के लिए पैरामीटर वैल्यू को |
||||||
scope |
ज़रूरी
स्कोप की ऐसी सूची जिन्हें अलग-अलग फ़ॉर्मैट में इस्तेमाल किया जा सकता है. इससे उन संसाधनों की पहचान होती है जिन्हें आपका ऐप्लिकेशन, उपयोगकर्ता की ओर से ऐक्सेस कर सकता है. ये वैल्यू उस स्क्रीन के बारे में जानकारी देती हैं जो Google को सहमति वाली स्क्रीन पर दिखता है. दायरे की मदद से, आपका ऐप्लिकेशन सिर्फ़ उन संसाधनों के ऐक्सेस का अनुरोध कर सकता है जिनकी उसे ज़रूरत है. साथ ही, इससे उपयोगकर्ता यह कंट्रोल कर सकते हैं कि वे आपके ऐप्लिकेशन को कितने ऐक्सेस दें. इसलिए, अनुरोध किए गए दायरों की संख्या और उपयोगकर्ता की सहमति लेने की संभावना के बीच काफ़ी अंतर होता है. हमारा सुझाव है कि जब भी मुमकिन हो, तब अपने ऐप्लिकेशन से अनुमति वाले दायरे के ऐक्सेस का अनुरोध करें. इंक्रीमेंटल अनुमति से, उपयोगकर्ता के डेटा का ऐक्सेस पाने के लिए अनुरोध करने से, उपयोगकर्ताओं को यह समझने में आसानी होती है कि आपके ऐप्लिकेशन को डेटा ऐक्सेस करने की अनुमति क्यों चाहिए. |
||||||
access_type |
सुझाया गया
इससे यह पता चलता है कि उपयोगकर्ता के ब्राउज़र पर मौजूद न होने पर, आपका ऐप्लिकेशन ऐक्सेस टोकन को रीफ़्रेश कर सकता है या नहीं. पैरामीटर की मान्य वैल्यू अगर आपके ऐप्लिकेशन को ऐक्सेस टोकन रीफ़्रेश करने की ज़रूरत है, तो उपयोगकर्ता के ब्राउज़र पर मौजूद न होने पर,
वैल्यू को |
||||||
state |
सुझाया गया
इससे ऐसी स्ट्रिंग की वैल्यू के बारे में पता चलता है जिसका इस्तेमाल आपका ऐप्लिकेशन, अनुमति देने के आपके अनुरोध और अनुमति देने वाले सर्वर के रिस्पॉन्स के बीच की स्थिति बनाए रखने के लिए करता है.
सर्वर, वही वैल्यू दिखाता है जो आपने
इस पैरामीटर का इस्तेमाल कई कामों के लिए किया जा सकता है. जैसे, उपयोगकर्ता को अपने ऐप्लिकेशन में
सही संसाधन पर ले जाना, नॉन्स भेजना, और दूसरी साइट से किए जाने वाले अनुरोधों की
जालसाज़ी को कम करना. आपके |
||||||
include_granted_scopes |
ज़रूरी नहीं
इससे ऐप्लिकेशन को कॉन्टेक्स्ट के हिसाब से, ज़्यादा दायरे के ऐक्सेस का अनुरोध करने के लिए, इंक्रीमेंटल अनुमति का इस्तेमाल करने की सुविधा मिलती है. अगर इस पैरामीटर की वैल्यू को |
||||||
enable_granular_consent |
ज़रूरी नहीं
डिफ़ॉल्ट तौर पर, यह वैल्यू |
||||||
login_hint |
ज़रूरी नहीं
अगर आपके ऐप्लिकेशन को पता है कि कौनसा उपयोगकर्ता पुष्टि करने की कोशिश कर रहा है, तो वह Google के पुष्टि करने वाले सर्वर को संकेत देने के लिए इस पैरामीटर का इस्तेमाल कर सकता है. सर्वर, लॉगिन फ़्लो को आसान बनाने के लिए संकेत का इस्तेमाल करता है. इसके लिए, साइन-इन फ़ॉर्म में ईमेल फ़ील्ड में जानकारी पहले से भरी होती है या एक से ज़्यादा लॉगिन वाले सही सेशन को चुना जाता है. पैरामीटर वैल्यू को ईमेल पते या |
||||||
prompt |
ज़रूरी नहीं
लोगों को दिखाने के लिए, प्रॉम्प्ट की ऐसी सूची जिसमें स्पेस को अलग-अलग जगह दी गई हो और जिसमें केस-सेंसिटिव (बड़े और छोटे अक्षरों में अंतर) हों. अगर इस पैरामीटर का इस्तेमाल नहीं किया जाता, तो उपयोगकर्ता को सिर्फ़ पहली बार आपके प्रोजेक्ट से ऐक्सेस का अनुरोध करने पर सूचना मिलेगी. ज़्यादा जानकारी के लिए, फिर से सहमति देना देखें. आपको ये वैल्यू दिख सकती हैं:
|
दूसरा चरण: Google के OAuth 2.0 सर्वर पर रीडायरेक्ट करना
पुष्टि करने और अनुमति देने की प्रोसेस शुरू करने के लिए, उपयोगकर्ता को Google के OAuth 2.0 सर्वर पर रीडायरेक्ट करें. आम तौर पर, ऐसा तब होता है, जब आपके ऐप्लिकेशन को पहली बार उपयोगकर्ता के डेटा को ऐक्सेस करने की ज़रूरत होती है. इंक्रीमेंटल अनुमति के मामले में, यह चरण तब भी होता है, जब आपके ऐप्लिकेशन को पहली बार ऐसे अतिरिक्त संसाधनों को ऐक्सेस करने की ज़रूरत होती है जिन्हें ऐक्सेस करने की अनुमति उसके पास नहीं होती.
PHP
- Google के OAuth 2.0 सर्वर से ऐक्सेस का अनुरोध करने के लिए, यूआरएल जनरेट करें:
$auth_url = $client->createAuthUrl();
- उपयोगकर्ता को
$auth_url
पर रीडायरेक्ट करें:header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));
Python
इस उदाहरण में, Flask वेब ऐप्लिकेशन फ़्रेमवर्क का इस्तेमाल करके, लोगों को अनुमति वाले यूआरएल पर रीडायरेक्ट करने का तरीका बताया गया है:
return flask.redirect(authorization_url)
Ruby
- Google के OAuth 2.0 सर्वर से ऐक्सेस का अनुरोध करने के लिए, यूआरएल जनरेट करें:
auth_uri = authorizer.get_authorization_url(login_hint: user_id, request: request)
- उपयोगकर्ता को
auth_uri
पर रीडायरेक्ट करें.
Node.js
-
Google के OAuth 2.0 सर्वर से ऐक्सेस का अनुरोध करने के लिए, पहले चरण
generateAuthUrl
तरीके से जनरेट किए गए यूआरएलauthorizationUrl
का इस्तेमाल करें. -
उपयोगकर्ता को
authorizationUrl
पर रीडायरेक्ट करें.res.writeHead(301, { "Location": authorizationUrl });
HTTP/REST
Sample redirect to Google's authorization server
An example URL is shown below, with line breaks and spaces for readability.
https://accounts.google.com/o/oauth2/v2/auth? scope=https%3A//www.googleapis.com/auth/drive.metadata.readonly& access_type=offline& include_granted_scopes=true& response_type=code& state=state_parameter_passthrough_value& redirect_uri=https%3A//oauth2.example.com/code& client_id=client_id
अनुरोध का यूआरएल बनाने के बाद, लोगों को उस पर रीडायरेक्ट करें.
Google का OAuth 2.0 सर्वर, उपयोगकर्ता की पुष्टि करता है. साथ ही, आपके ऐप्लिकेशन से अनुरोध किए गए दायरे को ऐक्सेस करने के लिए, उपयोगकर्ता की सहमति ली जाती है. आपके बताए गए दूसरे वेबलिंक का इस्तेमाल करके, रिस्पॉन्स को आपके ऐप्लिकेशन पर वापस भेजा जाता है.
तीसरा चरण: Google, उपयोगकर्ता से सहमति के लिए अनुरोध करता है
इस चरण में, उपयोगकर्ता तय करता है कि आपके ऐप्लिकेशन को अनुरोध किया गया ऐक्सेस देना है या नहीं. इस चरण में, Google एक सहमति विंडो दिखाता है. इसमें आपके ऐप्लिकेशन और उन Google API सेवाओं का नाम दिखता है जिन्हें ऐक्सेस करने के लिए वह उपयोगकर्ता के ऑथराइज़ेशन क्रेडेंशियल की मदद से, ऐक्सेस देने का अनुरोध करता है. साथ ही, ऐक्सेस देने के दायरे की खास जानकारी भी दिखती है. इसके बाद, उपयोगकर्ता आपके ऐप्लिकेशन के अनुरोध किए गए एक या उससे ज़्यादा दायरों का ऐक्सेस देने की सहमति दे सकता है या अनुरोध को अस्वीकार कर सकता है.
इस चरण में, आपके ऐप्लिकेशन को कुछ करने की ज़रूरत नहीं होती. ऐसा इसलिए, क्योंकि यह इंतज़ार करता है कि Google के OAuth 2.0 सर्वर से रिस्पॉन्स मिले कि कोई ऐक्सेस दिया गया है या नहीं. इस जवाब के बारे में इस चरण में बताया गया है.
गड़बड़ियां
Google के OAuth 2.0 के ऑथराइज़ेशन एंडपॉइंट के अनुरोधों में, पुष्टि करने और ऑथराइज़ेशन फ़्लो के बजाय, उपयोगकर्ता को दिखने वाले गड़बड़ी के मैसेज दिख सकते हैं. आम गड़बड़ी कोड और सुझाए गए तरीकों के बारे में नीचे बताया गया है.
admin_policy_enforced
Google खाते के Google Workspace एडमिन की नीतियों की वजह से, अनुरोध किए गए एक या उससे ज़्यादा दायरे को Google खाता अनुमति नहीं दे सकता. Google Workspace एडमिन के लिए सहायता लेख पढ़ें यह तय करें कि तीसरे पक्ष और आपके डोमेन के मालिकाना हक वाले कौनसे ऐप्लिकेशन, Google Workspace का डेटा ऐक्सेस कर सकते हैं. इस बारे में ज़्यादा जानने के लिए कि एडमिन आपके OAuth क्लाइंट आईडी का ऐक्सेस साफ़ तौर पर मिलने तक, सभी स्कोप या संवेदनशील और पाबंदी वाले दायरों के ऐक्सेस पर पाबंदी कैसे लगा सकता है.
disallowed_useragent
ऑथराइज़ेशन एंडपॉइंट, एम्बेड किए गए ऐसे उपयोगकर्ता-एजेंट में दिखाया जाता है जिसे Google की OAuth 2.0 नीतियों के तहत अनुमति नहीं है.
Android
Android डेवलपर को यह गड़बड़ी का मैसेज,
android.webkit.WebView
में अनुमति के अनुरोध खोलते समय दिख सकता है.
इसके बजाय, डेवलपर को Android लाइब्रेरी का इस्तेमाल करना चाहिए. जैसे,
Android के लिए Google साइन-इन या OpenID फ़ाउंडेशन के
Android के लिए AppAuth.
वेब डेवलपर को यह गड़बड़ी तब दिख सकती है, जब कोई Android ऐप्लिकेशन, एम्बेड किए गए उपयोगकर्ता-एजेंट में सामान्य वेब लिंक खोलता है और कोई उपयोगकर्ता आपकी साइट से Google के OAuth 2.0 ऑथराइज़ेशन एंडपॉइंट पर नेविगेट करता है. डेवलपर को ऑपरेटिंग सिस्टम के डिफ़ॉल्ट लिंक हैंडलर में सामान्य लिंक खोलने की अनुमति देनी चाहिए. इसमें, Android ऐप्लिकेशन के लिंक हैंडलर या डिफ़ॉल्ट ब्राउज़र ऐप्लिकेशन, दोनों शामिल हैं. Android की कस्टम टैब लाइब्रेरी भी काम करती है.
iOS
iOS और macOS डेवलपर को यह गड़बड़ी,
WKWebView
में अनुमति के अनुरोध खोलते समय दिख सकती है.
इसके बजाय, डेवलपर को iOS लाइब्रेरी का इस्तेमाल करना चाहिए, जैसे कि
iOS के लिए 'Google साइन-इन' या OpenID फ़ाउंडेशन के
iOS के लिए AppAuth.
वेब डेवलपर को यह गड़बड़ी तब दिख सकती है, जब कोई iOS या macOS ऐप्लिकेशन, एम्बेड किए गए उपयोगकर्ता-एजेंट में कोई सामान्य वेब लिंक खोलता है और कोई उपयोगकर्ता आपकी साइट से, Google के OAuth 2.0 ऑथराइज़ेशन एंडपॉइंट पर
नेविगेट करता है. डेवलपर को ऑपरेटिंग सिस्टम के डिफ़ॉल्ट लिंक हैंडलर में सामान्य लिंक
खोलने की अनुमति देनी चाहिए. इसमें यूनिवर्सल लिंक
हैंडलर या डिफ़ॉल्ट ब्राउज़र ऐप्लिकेशन, दोनों शामिल हैं.
SFSafariViewController
लाइब्रेरी भी काम करती है.
org_internal
अनुरोध में मौजूद OAuth क्लाइंट आईडी, एक ऐसे प्रोजेक्ट का हिस्सा है जो किसी Google Cloud संगठन में मौजूद Google खातों का ऐक्सेस सीमित करता है. इस कॉन्फ़िगरेशन के विकल्प के बारे में ज़्यादा जानकारी के लिए, OAuth के लिए सहमति वाली स्क्रीन को सेट अप करने से जुड़े सहायता लेख में, उपयोगकर्ता का टाइप सेक्शन देखें.
invalid_client
OAuth क्लाइंट सीक्रेट गलत है. OAuth क्लाइंट कॉन्फ़िगरेशन की समीक्षा करें. इसमें इस अनुरोध के लिए इस्तेमाल किया गया क्लाइंट आईडी और सीक्रेट शामिल है.
invalid_grant
ऐक्सेस टोकन को रीफ़्रेश करते समय या इंक्रीमेंटल ऑथराइज़ेशन का इस्तेमाल करते समय, हो सकता है कि टोकन की समयसीमा खत्म हो गई हो या वह अमान्य हो. उपयोगकर्ता की फिर से पुष्टि करें और नए टोकन पाने के लिए, उपयोगकर्ता की सहमति मांगें. अगर आपको यह गड़बड़ी लगातार दिख रही है, तो पक्का करें कि आपका ऐप्लिकेशन सही तरीके से कॉन्फ़िगर किया गया हो. साथ ही, यह भी पक्का करें कि अनुरोध में सही टोकन और पैरामीटर का इस्तेमाल किया जा रहा हो. अगर ऐसा नहीं किया जाता है, तो हो सकता है कि उपयोगकर्ता खाता मिटा दिया गया हो या उसे बंद कर दिया गया हो.
redirect_uri_mismatch
अनुमति के अनुरोध में पास किया गया redirect_uri
, OAuth क्लाइंट आईडी के लिए अनुमति वाले रीडायरेक्ट यूआरआई से मेल नहीं खाता. Google API Console Credentials page
में अनुमति वाले रीडायरेक्ट यूआरआई की समीक्षा करें.
redirect_uri
पैरामीटर से, OAuth आउट-ऑफ़-बैंड (OOB) फ़्लो का रेफ़रंस हो सकता है. इसे अब बंद कर दिया गया है और यह अब काम नहीं करता. अपना इंटिग्रेशन अपडेट करने के लिए,
डेटा को दूसरी जगह भेजने से जुड़ी गाइड
देखें.
invalid_request
आपने जो अनुरोध किया है उसमें कोई गड़बड़ी है. ऐसा कई वजहों से हो सकता है:
- अनुरोध सही तरीके से फ़ॉर्मैट नहीं किया गया था
- अनुरोध में ज़रूरी पैरामीटर मौजूद नहीं थे
- अनुरोध के लिए, अनुमति देने के किसी ऐसे तरीके का इस्तेमाल किया गया है जो Google पर काम नहीं करता. पुष्टि करें कि आपका OAuth इंटिग्रेशन, सुझाए गए इंटिग्रेशन के तरीके का इस्तेमाल करता है
चौथा चरण: OAuth 2.0 सर्वर से मिले रिस्पॉन्स को मैनेज करना
OAuth 2.0 सर्वर, अनुरोध में बताए गए यूआरएल का इस्तेमाल करके, आपके ऐप्लिकेशन के ऐक्सेस के अनुरोध का जवाब देता है.
अगर उपयोगकर्ता, ऐक्सेस के अनुरोध को मंज़ूरी देता है, तो जवाब में एक ऑथराइज़ेशन कोड शामिल होता है. अगर उपयोगकर्ता अनुरोध को स्वीकार नहीं करता है, तो जवाब में गड़बड़ी का मैसेज दिखता है. वेब सर्वर को भेजा गया ऑथराइज़ेशन कोड या गड़बड़ी का मैसेज, क्वेरी स्ट्रिंग पर दिखता है, जैसा कि यहां दिखाया गया है:
गड़बड़ी का जवाब:
https://oauth2.example.com/auth?error=access_denied
ऑथराइज़ेशन कोड रिस्पॉन्स:
https://oauth2.example.com/auth?code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7
OAuth 2.0 सर्वर के रिस्पॉन्स का उदाहरण
नीचे दिए गए सैंपल यूआरएल पर क्लिक करके, इस फ़्लो की जांच की जा सकती है. यह यूआरएल, आपकी Google Drive में मौजूद फ़ाइलों का मेटाडेटा देखने के लिए, रीड ओनली ऐक्सेस का अनुरोध करता है:
https://accounts.google.com/o/oauth2/v2/auth? scope=https%3A//www.googleapis.com/auth/drive.metadata.readonly& access_type=offline& include_granted_scopes=true& response_type=code& state=state_parameter_passthrough_value& redirect_uri=https%3A//oauth2.example.com/code& client_id=client_id
OAuth 2.0 फ़्लो को पूरा करने के बाद, आपको http://localhost/oauth2callback
पर रीडायरेक्ट किया जाएगा. इससे 404 NOT FOUND
की गड़बड़ी हो सकती है. अगर आपकी लोकल मशीन, उस पते पर कोई फ़ाइल नहीं दिखाती है, तो गड़बड़ी हो सकती है. अगले चरण में, उपयोगकर्ता को आपके ऐप्लिकेशन पर वापस रीडायरेक्ट किए जाने पर, यूआरआई में वापस की गई जानकारी के बारे में ज़्यादा जानकारी दी जाती है.
पांचवां चरण: रीफ़्रेश और ऐक्सेस टोकन के लिए एक्सचेंज ऑथराइज़ेशन कोड
वेब सर्वर को ऑथराइज़ेशन कोड मिलने के बाद, वह ऐक्सेस टोकन के लिए ऑथराइज़ेशन कोड को बदल सकता है.
PHP
किसी ऐक्सेस टोकन के लिए ऑथराइज़ेशन कोड को बदलने के लिए, authenticate
तरीके का इस्तेमाल करें:
$client->authenticate($_GET['code']);
getAccessToken
तरीके का इस्तेमाल करके, ऐक्सेस टोकन को वापस पाया जा सकता है:
$access_token = $client->getAccessToken();
Python
अपने कॉलबैक पेज पर, google-auth
लाइब्रेरी का इस्तेमाल करके, ऑथराइज़ेशन सर्वर के रिस्पॉन्स की पुष्टि करें. इसके बाद, रिस्पॉन्स में मिले ऑथराइज़ेशन कोड को ऐक्सेस टोकन देने के लिए, flow.fetch_token
तरीके का इस्तेमाल करें:
state = flask.session['state'] flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file( 'client_secret.json', scopes=['https://www.googleapis.com/auth/drive.metadata.readonly'], state=state) flow.redirect_uri = flask.url_for('oauth2callback', _external=True) authorization_response = flask.request.url flow.fetch_token(authorization_response=authorization_response) # Store the credentials in the session. # ACTION ITEM for developers: # Store user's access and refresh tokens in your data store if # incorporating this code into your real app. credentials = flow.credentials flask.session['credentials'] = { 'token': credentials.token, 'refresh_token': credentials.refresh_token, 'token_uri': credentials.token_uri, 'client_id': credentials.client_id, 'client_secret': credentials.client_secret, 'scopes': credentials.scopes}
Ruby
अपने कॉलबैक पेज पर, googleauth
लाइब्रेरी का इस्तेमाल करके, ऑथराइज़ेशन सर्वर के रिस्पॉन्स की पुष्टि करें. ऑथराइज़ेशन कोड को सेव करने के लिए, authorizer.handle_auth_callback_deferred
तरीके का इस्तेमाल करें. साथ ही, उस यूआरएल पर वापस रीडायरेक्ट करें जिससे अनुमति का अनुरोध किया गया था. इससे,
उपयोगकर्ता के सेशन में नतीजों को कुछ समय के लिए रोककर कोड को बदला नहीं जाता.
target_url = Google::Auth::WebUserAuthorizer.handle_auth_callback_deferred(request) redirect target_url
Node.js
किसी ऐक्सेस टोकन के लिए ऑथराइज़ेशन कोड को बदलने के लिए, getToken
तरीके का इस्तेमाल करें:
const url = require('url'); // Receive the callback from Google's OAuth 2.0 server. if (req.url.startsWith('/oauth2callback')) { // Handle the OAuth 2.0 server response let q = url.parse(req.url, true).query; // Get access and refresh tokens (if access_type is offline) let { tokens } = await oauth2Client.getToken(q.code); oauth2Client.setCredentials(tokens); }
एचटीटीपी/REST
किसी ऐक्सेस टोकन के लिए ऑथराइज़ेशन कोड को बदलने के लिए, https://oauth2.googleapis.com/token
एंडपॉइंट को कॉल करें और नीचे दिए गए पैरामीटर सेट करें:
फ़ील्ड | |
---|---|
client_id |
API Console Credentials pageसे मिला क्लाइंट आईडी. |
client_secret |
API Console Credentials pageसे मिला क्लाइंट सीक्रेट. |
code |
शुरुआती अनुरोध करने पर ओटीपी मिला. |
grant_type |
OAuth 2.0
स्पेसिफ़िकेशन में दी गई जानकारी के मुताबिक, इस फ़ील्ड की वैल्यू authorization_code पर सेट होनी चाहिए. |
redirect_uri |
दिए गए client_id के लिए, API Console
Credentials page में आपके प्रोजेक्ट के लिए सूची में शामिल रीडायरेक्ट यूआरआई में से एक. |
नीचे दिया गया स्निपेट, अनुरोध का एक नमूना दिखाता है:
POST /token HTTP/1.1 Host: oauth2.googleapis.com Content-Type: application/x-www-form-urlencoded code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7& client_id=your_client_id& client_secret=your_client_secret& redirect_uri=https%3A//oauth2.example.com/code& grant_type=authorization_code
इस अनुरोध का जवाब देने के लिए, Google एक JSON ऑब्जेक्ट दिखाता है. इसमें, कुछ समय तक इस्तेमाल किया जा सकने वाला ऐक्सेस टोकन और रीफ़्रेश टोकन मौजूद होता है.
ध्यान दें कि रीफ़्रेश टोकन सिर्फ़ तब दिखता है, जब आपके ऐप्लिकेशन ने Google के ऑथराइज़ेशन सर्वर से किए गए शुरुआती अनुरोध में, access_type
पैरामीटर को offline
पर सेट किया हो.
जवाब में ये फ़ील्ड शामिल होते हैं:
फ़ील्ड | |
---|---|
access_token |
वह टोकन जिसे आपका ऐप्लिकेशन, Google API अनुरोध की अनुमति देने के लिए भेजता है. |
expires_in |
ऐक्सेस टोकन की बची हुई अवधि (सेकंड में). |
refresh_token |
एक टोकन जिसका इस्तेमाल करके आप नया ऐक्सेस टोकन पा सकते हैं. रीफ़्रेश टोकन तब तक मान्य रहते हैं, जब तक उपयोगकर्ता ऐक्सेस रद्द नहीं कर देता.
ध्यान दें, इस रिस्पॉन्स में यह फ़ील्ड सिर्फ़ तब दिखता है, जब Google के ऑथराइज़ेशन सर्वर से किए जाने वाले शुरुआती अनुरोध में access_type पैरामीटर को offline पर सेट किया जाता है.
|
scope |
access_token के दिए गए ऐक्सेस के स्कोप को स्पेस-डीलिमिटेड, केस-सेंसिटिव स्ट्रिंग की सूची के तौर पर दिखाया जाता है. |
token_type |
दिखाया गया टोकन किस तरह का है. इस समय, इस फ़ील्ड की वैल्यू हमेशा
Bearer पर सेट रहती है. |
यह स्निपेट एक सैंपल रिस्पॉन्स दिखाता है:
{ "access_token": "1/fFAGRNJru1FTz70BzhT3Zg", "expires_in": 3920, "token_type": "Bearer", "scope": "https://www.googleapis.com/auth/drive.metadata.readonly", "refresh_token": "1//xEoDL4iW3cxlI7yDbSRFYNG01kVKM2C-259HOF2aQbI" }
गड़बड़ियां
ऐक्सेस टोकन के लिए ऑथराइज़ेशन कोड की अदला-बदली करते समय, आपको सही रिस्पॉन्स के बजाय, यह गड़बड़ी दिख सकती है. आम गड़बड़ी कोड और सुझाए गए तरीकों के बारे में नीचे बताया गया है.
invalid_grant
दिया गया ऑथराइज़ेशन कोड अमान्य है या गलत फ़ॉर्मैट में है. उपयोगकर्ता से फिर से सहमति लेने के लिए, OAuth प्रोसेस फिर से शुरू करके नए कोड का अनुरोध करें.
Google API को कॉल करना
PHP
नीचे दिए गए चरण पूरे करके, Google API को कॉल करने के लिए ऐक्सेस टोकन का इस्तेमाल करें:
- अगर आपको नए
Google\Client
ऑब्जेक्ट में ऐक्सेस टोकन लागू करना है — उदाहरण के लिए, अगर आपने उपयोगकर्ता सेशन में ऐक्सेस टोकन सेव किया है, तो —setAccessToken
तरीके का इस्तेमाल करें:$client->setAccessToken($access_token);
- उस एपीआई के लिए सेवा ऑब्जेक्ट बनाएं जिसे आपको कॉल करना है. आपको जिस एपीआई को कॉल करना है उसके कंस्ट्रक्टर को
आधिकारिक
Google\Client
ऑब्जेक्ट देकर, सर्विस ऑब्जेक्ट बनाया जा सकता है. उदाहरण के लिए, Drive API को कॉल करने के लिए:$drive = new Google\Service\Drive($client);
- सर्विस ऑब्जेक्ट से मिले इंटरफ़ेस का इस्तेमाल करके,
एपीआई सेवा को अनुरोध करें.
उदाहरण के लिए, पुष्टि किए गए उपयोगकर्ता के Google Drive में फ़ाइलों को शामिल करने के लिए:
$files = $drive->files->listFiles(array())->getItems();
Python
ऐक्सेस टोकन पाने के बाद, आपका ऐप्लिकेशन उस टोकन का इस्तेमाल करके, दिए गए उपयोगकर्ता खाते या सेवा खाते की ओर से एपीआई अनुरोधों को अनुमति दे सकता है. उस एपीआई के लिए सेवा ऑब्जेक्ट बनाएं जिसे आपको कॉल करना है. इसके बाद, उस ऑब्जेक्ट का इस्तेमाल करके अनुमति वाले एपीआई अनुरोध करें. इसके लिए, उपयोगकर्ता से जुड़े खास ऑथराइज़ेशन क्रेडेंशियल का इस्तेमाल करें.
- उस एपीआई के लिए सेवा ऑब्जेक्ट बनाएं जिसे आपको कॉल करना है. एपीआई के नाम और वर्शन और उपयोगकर्ता क्रेडेंशियल के साथ,
googleapiclient.discovery
लाइब्रेरी केbuild
तरीके को कॉल करके सर्विस ऑब्जेक्ट बनाया जाता है: उदाहरण के लिए, Drive API के वर्शन 3 को कॉल करने के लिए:from googleapiclient.discovery import build drive = build('drive', 'v2', credentials=credentials)
- सर्विस ऑब्जेक्ट से मिले इंटरफ़ेस का इस्तेमाल करके,
एपीआई सेवा को अनुरोध करें.
उदाहरण के लिए, पुष्टि किए गए उपयोगकर्ता के Google Drive में फ़ाइलों को शामिल करने के लिए:
files = drive.files().list().execute()
Ruby
ऐक्सेस टोकन पाने के बाद, आपका ऐप्लिकेशन उस टोकन का इस्तेमाल करके, दिए गए उपयोगकर्ता खाते या सेवा खाते की ओर से एपीआई अनुरोध कर सकता है. उस एपीआई के लिए सेवा ऑब्जेक्ट बनाएं जिसे आपको कॉल करना है. इसके बाद, उस ऑब्जेक्ट का इस्तेमाल करके अनुमति वाले एपीआई अनुरोध करें. इसके लिए, उपयोगकर्ता से जुड़े खास ऑथराइज़ेशन क्रेडेंशियल का इस्तेमाल करें.
- उस एपीआई के लिए सेवा ऑब्जेक्ट बनाएं जिसे आपको कॉल करना है.
उदाहरण के लिए, Drive API के वर्शन 3 को कॉल करने के लिए:
drive = Google::Apis::DriveV3::DriveService.new
- सेवा पर क्रेडेंशियल सेट करें:
drive.authorization = credentials
- सर्विस ऑब्जेक्ट से मिले इंटरफ़ेस
का इस्तेमाल करके, एपीआई सेवा को अनुरोध करें.
उदाहरण के लिए, पुष्टि किए गए उपयोगकर्ता के Google Drive में फ़ाइलों को शामिल करने के लिए:
files = drive.list_files
इसके अलावा, किसी तरीके में options
पैरामीटर देकर, हर तरीके के हिसाब से
अनुमति दी जा सकती है:
files = drive.list_files(options: { authorization: credentials })
Node.js
ऐक्सेस टोकन पाने और उसे OAuth2
ऑब्जेक्ट पर सेट करने के बाद, Google API को कॉल करने के लिए ऑब्जेक्ट का इस्तेमाल करें. आपका ऐप्लिकेशन, उस टोकन का इस्तेमाल करके, दिए गए उपयोगकर्ता खाते या सेवा खाते की ओर से एपीआई अनुरोधों को
अनुमति दे सकता है. उस एपीआई के लिए सेवा ऑब्जेक्ट बनाएं जिसे आपको कॉल करना है.
const { google } = require('googleapis'); // Example of using Google Drive API to list filenames in user's Drive. const drive = google.drive('v3'); drive.files.list({ auth: oauth2Client, pageSize: 10, fields: 'nextPageToken, files(id, name)', }, (err1, res1) => { if (err1) return console.log('The API returned an error: ' + err1); const files = res1.data.files; if (files.length) { console.log('Files:'); files.map((file) => { console.log(`${file.name} (${file.id})`); }); } else { console.log('No files found.'); } });
एचटीटीपी/REST
जब आपके ऐप्लिकेशन को ऐक्सेस टोकन मिल जाता है, तब दिए गए उपयोगकर्ता खाते की ओर से Google API को कॉल करने के लिए, टोकन का इस्तेमाल किया जा सकता है. ऐसा तब किया जाता है, जब एपीआई के लिए ज़रूरी ऐक्सेस के दायरे स्वीकार कर लिए गए हों. ऐसा करने के लिए, एपीआई से किए जाने वाले अनुरोध में ऐक्सेस टोकन शामिल करें. इसके लिए, access_token
क्वेरी पैरामीटर या Authorization
एचटीटीपी हेडर Bearer
की वैल्यू शामिल करें. अगर हो सके, तो एचटीटीपी हेडर को प्राथमिकता दें, क्योंकि क्वेरी स्ट्रिंग आम तौर पर सर्वर लॉग में दिखती हैं. ज़्यादातर मामलों में, Google API पर कॉल सेट अप करने के लिए, क्लाइंट लाइब्रेरी का इस्तेमाल किया जा सकता है. उदाहरण के लिए, Drive Files API को कॉल करते समय.
OAuth 2.0 Playground पर, सभी Google API को आज़माया जा सकता है और उनके स्कोप देखे जा सकते हैं.
एचटीटीपी जीईटी के उदाहरण
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
उदाहरण को पूरा करें
नीचे दिया गया उदाहरण उपयोगकर्ता के पुष्टि करने और ऐप्लिकेशन को उपयोगकर्ता के Drive मेटाडेटा को ऐक्सेस करने की सहमति देने के बाद, उपयोगकर्ता की Google Drive में फ़ाइलों की JSON फ़ॉर्मैट वाली सूची को प्रिंट करता है.
PHP
इस उदाहरण को चलाने के लिए:
- API Consoleमें, लोकल मशीन का यूआरएल,
रीडायरेक्ट यूआरएल की सूची में जोड़ें. उदाहरण के लिए,
http://localhost:8080
जोड़ें. - नई डायरेक्ट्री बनाएं और उसमें बदलाव करें. उदाहरण के लिए:
mkdir ~/php-oauth2-example cd ~/php-oauth2-example
- कंपोज़र का इस्तेमाल करके, PHP के लिए Google API क्लाइंट
लाइब्रेरी इंस्टॉल करें:
composer require google/apiclient:^2.10
- यहां दिए गए कॉन्टेंट का इस्तेमाल करके,
index.php
औरoauth2callback.php
फ़ाइलें बनाएं. - इस उदाहरण को उस वेब सर्वर के साथ चलाएं जो PHP को इस्तेमाल करने के लिए कॉन्फ़िगर किया गया हो. अगर आप PHP 5.6 या उसके बाद के वर्शन का इस्तेमाल करते हैं, तो
आप PHP के बिल्ट-इन टेस्ट वेब सर्वर का इस्तेमाल कर सकते हैं:
php -S localhost:8080 ~/php-oauth2-example
index.php
<?php require_once __DIR__.'/vendor/autoload.php'; session_start(); $client = new Google\Client(); $client->setAuthConfig('client_secrets.json'); $client->addScope(Google\Service\Drive::DRIVE_METADATA_READONLY); if (isset($_SESSION['access_token']) && $_SESSION['access_token']) { $client->setAccessToken($_SESSION['access_token']); $drive = new Google\Service\Drive($client); $files = $drive->files->listFiles(array())->getItems(); echo json_encode($files); } else { $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php'; header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL)); }
oauth2callback.php
<?php require_once __DIR__.'/vendor/autoload.php'; session_start(); $client = new Google\Client(); $client->setAuthConfigFile('client_secrets.json'); $client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php'); $client->addScope(Google\Service\Drive::DRIVE_METADATA_READONLY); if (! isset($_GET['code'])) { $auth_url = $client->createAuthUrl(); header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL)); } else { $client->authenticate($_GET['code']); $_SESSION['access_token'] = $client->getAccessToken(); $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/'; header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL)); }
Python
इस उदाहरण में, Flask फ़्रेमवर्क का इस्तेमाल किया गया है. यह
http://localhost:8080
पर एक वेब ऐप्लिकेशन चलाता है. इससे, आपको OAuth 2.0 फ़्लो की जांच करने की सुविधा मिलती है. उस यूआरएल पर जाने पर, आपको चार लिंक दिखेंगे:
- एपीआई अनुरोध की जांच करना: यह लिंक उस पेज पर ले जाता है जो सैंपल एपीआई अनुरोध को लागू करने की कोशिश करता है. अगर ज़रूरी हो, तो अनुमति देने की प्रक्रिया शुरू कर दी जाती है. अगर प्रोसेस पूरी हो जाती है, तो पेज पर एपीआई से मिला रिस्पॉन्स दिखता है.
- सीधे तौर पर पुष्टि करने के फ़्लो की जांच करना: यह लिंक उस पेज पर ले जाता है जो उपयोगकर्ता को अनुमति के फ़्लो के ज़रिए भेजने की कोशिश करता है. ऐप्लिकेशन, उपयोगकर्ता की ओर से अनुमति वाले एपीआई अनुरोध सबमिट करने की अनुमति मांगता है.
- मौजूदा क्रेडेंशियल रद्द करना: यह लिंक ऐसे पेज पर ले जाता है जो उपयोगकर्ता ने ऐप्लिकेशन को पहले से दी गई अनुमतियां निरस्त करता है.
- फ़्लास्क सेशन के क्रेडेंशियल मिटाएं: यह लिंक, फ़्लास्क सेशन में सेव किए गए अनुमति देने वाले क्रेडेंशियल हटाता है. इसकी मदद से यह देखा जा सकता है कि अगर आपके ऐप्लिकेशन को पहले से अनुमति दे चुके किसी उपयोगकर्ता ने नए सेशन में, एपीआई अनुरोध को एक्ज़ीक्यूट करने की कोशिश की है, तो क्या होगा. इससे यह भी पता चलता है कि आपके ऐप्लिकेशन को दी गई अनुमतियां रद्द करने के बाद भी, आपके ऐप्लिकेशन को एपीआई से कौनसा रिस्पॉन्स मिलेगा. ऐसा तब भी होता है, जब आपके ऐप्लिकेशन ने ऐक्सेस टोकन वापस लेने के अनुरोध को अनुमति देने की कोशिश की हो.
# -*- coding: utf-8 -*- import os import flask import requests import google.oauth2.credentials import google_auth_oauthlib.flow import googleapiclient.discovery # This variable specifies the name of a file that contains the OAuth 2.0 # information for this application, including its client_id and client_secret. CLIENT_SECRETS_FILE = "client_secret.json" # This OAuth 2.0 access scope allows for full read/write access to the # authenticated user's account and requires requests to use an SSL connection. SCOPES = ['https://www.googleapis.com/auth/drive.metadata.readonly'] API_SERVICE_NAME = 'drive' API_VERSION = 'v2' app = flask.Flask(__name__) # Note: A secret key is included in the sample so that it works. # If you use this code in your application, replace this with a truly secret # key. See https://flask.palletsprojects.com/quickstart/#sessions. app.secret_key = 'REPLACE ME - this value is here as a placeholder.' @app.route('/') def index(): return print_index_table() @app.route('/test') def test_api_request(): if 'credentials' not in flask.session: return flask.redirect('authorize') # Load credentials from the session. credentials = google.oauth2.credentials.Credentials( **flask.session['credentials']) drive = googleapiclient.discovery.build( API_SERVICE_NAME, API_VERSION, credentials=credentials) files = drive.files().list().execute() # Save credentials back to session in case access token was refreshed. # ACTION ITEM: In a production app, you likely want to save these # credentials in a persistent database instead. flask.session['credentials'] = credentials_to_dict(credentials) return flask.jsonify(**files) @app.route('/authorize') def authorize(): # Create flow instance to manage the OAuth 2.0 Authorization Grant Flow steps. flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file( CLIENT_SECRETS_FILE, scopes=SCOPES) # The URI created here must exactly match one of the authorized redirect URIs # for the OAuth 2.0 client, which you configured in the API Console. If this # value doesn't match an authorized URI, you will get a 'redirect_uri_mismatch' # error. flow.redirect_uri = flask.url_for('oauth2callback', _external=True) authorization_url, state = flow.authorization_url( # Enable offline access so that you can refresh an access token without # re-prompting the user for permission. Recommended for web server apps. access_type='offline', # Enable incremental authorization. Recommended as a best practice. include_granted_scopes='true') # Store the state so the callback can verify the auth server response. flask.session['state'] = state return flask.redirect(authorization_url) @app.route('/oauth2callback') def oauth2callback(): # Specify the state when creating the flow in the callback so that it can # verified in the authorization server response. state = flask.session['state'] flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file( CLIENT_SECRETS_FILE, scopes=SCOPES, state=state) flow.redirect_uri = flask.url_for('oauth2callback', _external=True) # Use the authorization server's response to fetch the OAuth 2.0 tokens. authorization_response = flask.request.url flow.fetch_token(authorization_response=authorization_response) # Store credentials in the session. # ACTION ITEM: In a production app, you likely want to save these # credentials in a persistent database instead. credentials = flow.credentials flask.session['credentials'] = credentials_to_dict(credentials) return flask.redirect(flask.url_for('test_api_request')) @app.route('/revoke') def revoke(): if 'credentials' not in flask.session: return ('You need to <a href="/authorize">authorize</a> before ' + 'testing the code to revoke credentials.') credentials = google.oauth2.credentials.Credentials( **flask.session['credentials']) revoke = requests.post('https://oauth2.googleapis.com/revoke', params={'token': credentials.token}, headers = {'content-type': 'application/x-www-form-urlencoded'}) status_code = getattr(revoke, 'status_code') if status_code == 200: return('Credentials successfully revoked.' + print_index_table()) else: return('An error occurred.' + print_index_table()) @app.route('/clear') def clear_credentials(): if 'credentials' in flask.session: del flask.session['credentials'] return ('Credentials have been cleared.<br><br>' + print_index_table()) def credentials_to_dict(credentials): return {'token': credentials.token, 'refresh_token': credentials.refresh_token, 'token_uri': credentials.token_uri, 'client_id': credentials.client_id, 'client_secret': credentials.client_secret, 'scopes': credentials.scopes} def print_index_table(): return ('<table>' + '<tr><td><a href="/test">Test an API request</a></td>' + '<td>Submit an API request and see a formatted JSON response. ' + ' Go through the authorization flow if there are no stored ' + ' credentials for the user.</td></tr>' + '<tr><td><a href="/authorize">Test the auth flow directly</a></td>' + '<td>Go directly to the authorization flow. If there are stored ' + ' credentials, you still might not be prompted to reauthorize ' + ' the application.</td></tr>' + '<tr><td><a href="/revoke">Revoke current credentials</a></td>' + '<td>Revoke the access token associated with the current user ' + ' session. After revoking credentials, if you go to the test ' + ' page, you should see an <code>invalid_grant</code> error.' + '</td></tr>' + '<tr><td><a href="/clear">Clear Flask session credentials</a></td>' + '<td>Clear the access token currently stored in the user session. ' + ' After clearing the token, if you <a href="/test">test the ' + ' API request</a> again, you should go back to the auth flow.' + '</td></tr></table>') if __name__ == '__main__': # When running locally, disable OAuthlib's HTTPs verification. # ACTION ITEM for developers: # When running in production *do not* leave this option enabled. os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1' # Specify a hostname and port that are set as a valid redirect URI # for your API project in the Google API Console. app.run('localhost', 8080, debug=True)
Ruby
इस उदाहरण में, Sinatra फ़्रेमवर्क का इस्तेमाल किया गया है.
require 'google/apis/drive_v3' require 'sinatra' require 'googleauth' require 'googleauth/stores/redis_token_store' configure do enable :sessions set :client_id, Google::Auth::ClientId.from_file('/path/to/client_secret.json') set :scope, Google::Apis::DriveV3::AUTH_DRIVE_METADATA_READONLY set :token_store, Google::Auth::Stores::RedisTokenStore.new(redis: Redis.new) set :authorizer, Google::Auth::WebUserAuthorizer.new(settings.client_id, settings.scope, settings.token_store, '/oauth2callback') end get '/' do user_id = settings.client_id.id credentials = settings.authorizer.get_credentials(user_id, request) if credentials.nil? redirect settings.authorizer.get_authorization_url(login_hint: user_id, request: request) end drive = Google::Apis::DriveV3::DriveService.new files = drive.list_files(options: { authorization: credentials }) "<pre>#{JSON.pretty_generate(files.to_h)}</pre>" end get '/oauth2callback' do target_url = Google::Auth::WebUserAuthorizer.handle_auth_callback_deferred(request) redirect target_url end
Node.js
इस उदाहरण को चलाने के लिए:
-
API Consoleमें, रीडायरेक्ट यूआरएल की सूची में लोकल मशीन का यूआरएल जोड़ें. उदाहरण के लिए,
http://localhost
जोड़ें. - पक्का करें कि आपने रखरखाव एलटीएस, चालू एलटीएस या Node.js की मौजूदा रिलीज़ को इंस्टॉल किया हो.
-
नई डायरेक्ट्री बनाएं और उसमें बदलाव करें. उदाहरण के लिए:
mkdir ~/nodejs-oauth2-example cd ~/nodejs-oauth2-example
-
Install the
Google API Client
Library
for Node.js using npm:
npm install googleapis
-
नीचे दिए गए कॉन्टेंट का इस्तेमाल करके,
main.js
फ़ाइल बनाएं. -
उदाहरण चलाएं:
node .\main.js
main.js
const http = require('http'); const https = require('https'); const url = require('url'); const { google } = require('googleapis'); /** * To use OAuth2 authentication, we need access to a CLIENT_ID, CLIENT_SECRET, AND REDIRECT_URI. * To get these credentials for your application, visit * https://console.cloud.google.com/apis/credentials. */ const oauth2Client = new google.auth.OAuth2( YOUR_CLIENT_ID, YOUR_CLIENT_SECRET, YOUR_REDIRECT_URL ); // Access scopes for read-only Drive activity. const scopes = [ 'https://www.googleapis.com/auth/drive.metadata.readonly' ]; // Generate a url that asks permissions for the Drive activity scope const authorizationUrl = oauth2Client.generateAuthUrl({ // 'online' (default) or 'offline' (gets refresh_token) access_type: 'offline', /** Pass in the scopes array defined above. * Alternatively, if only one scope is needed, you can pass a scope URL as a string */ scope: scopes, // Enable incremental authorization. Recommended as a best practice. include_granted_scopes: true }); /* Global variable that stores user credential in this code example. * ACTION ITEM for developers: * Store user's refresh token in your data store if * incorporating this code into your real app. * For more information on handling refresh tokens, * see https://github.com/googleapis/google-api-nodejs-client#handling-refresh-tokens */ let userCredential = null; async function main() { const server = http.createServer(async function (req, res) { // Example on redirecting user to Google's OAuth 2.0 server. if (req.url == '/') { res.writeHead(301, { "Location": authorizationUrl }); } // Receive the callback from Google's OAuth 2.0 server. if (req.url.startsWith('/oauth2callback')) { // Handle the OAuth 2.0 server response let q = url.parse(req.url, true).query; if (q.error) { // An error response e.g. error=access_denied console.log('Error:' + q.error); } else { // Get access and refresh tokens (if access_type is offline) let { tokens } = await oauth2Client.getToken(q.code); oauth2Client.setCredentials(tokens); /** Save credential to the global variable in case access token was refreshed. * ACTION ITEM: In a production app, you likely want to save the refresh token * in a secure persistent database instead. */ userCredential = tokens; // Example of using Google Drive API to list filenames in user's Drive. const drive = google.drive('v3'); drive.files.list({ auth: oauth2Client, pageSize: 10, fields: 'nextPageToken, files(id, name)', }, (err1, res1) => { if (err1) return console.log('The API returned an error: ' + err1); const files = res1.data.files; if (files.length) { console.log('Files:'); files.map((file) => { console.log(`${file.name} (${file.id})`); }); } else { console.log('No files found.'); } }); } } // Example on revoking a token if (req.url == '/revoke') { // Build the string for the POST request let postData = "token=" + userCredential.access_token; // Options for POST request to Google's OAuth 2.0 server to revoke a token let postOptions = { host: 'oauth2.googleapis.com', port: '443', path: '/revoke', method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'Content-Length': Buffer.byteLength(postData) } }; // Set up the request const postReq = https.request(postOptions, function (res) { res.setEncoding('utf8'); res.on('data', d => { console.log('Response: ' + d); }); }); postReq.on('error', error => { console.log(error) }); // Post the request with data postReq.write(postData); postReq.end(); } res.end(); }).listen(80); } main().catch(console.error);
एचटीटीपी/REST
Python का यह उदाहरण, OAuth 2.0 वेब फ़्लो को दिखाने के लिए, Flask फ़्रेमवर्क और Requests लाइब्रेरी का इस्तेमाल करता है. हमारा सुझाव है कि इस फ़्लो के लिए, Python के लिए Google API क्लाइंट लाइब्रेरी का इस्तेमाल करें. (Python टैब में मौजूद उदाहरण में क्लाइंट लाइब्रेरी का इस्तेमाल किया गया है.)
import json import flask import requests app = flask.Flask(__name__) CLIENT_ID = '123456789.apps.googleusercontent.com' CLIENT_SECRET = 'abc123' # Read from a file or environmental variable in a real app SCOPE = 'https://www.googleapis.com/auth/drive.metadata.readonly' REDIRECT_URI = 'http://example.com/oauth2callback' @app.route('/') def index(): if 'credentials' not in flask.session: return flask.redirect(flask.url_for('oauth2callback')) credentials = json.loads(flask.session['credentials']) if credentials['expires_in'] <= 0: return flask.redirect(flask.url_for('oauth2callback')) else: headers = {'Authorization': 'Bearer {}'.format(credentials['access_token'])} req_uri = 'https://www.googleapis.com/drive/v2/files' r = requests.get(req_uri, headers=headers) return r.text @app.route('/oauth2callback') def oauth2callback(): if 'code' not in flask.request.args: auth_uri = ('https://accounts.google.com/o/oauth2/v2/auth?response_type=code' '&client_id={}&redirect_uri={}&scope={}').format(CLIENT_ID, REDIRECT_URI, SCOPE) return flask.redirect(auth_uri) else: auth_code = flask.request.args.get('code') data = {'code': auth_code, 'client_id': CLIENT_ID, 'client_secret': CLIENT_SECRET, 'redirect_uri': REDIRECT_URI, 'grant_type': 'authorization_code'} r = requests.post('https://oauth2.googleapis.com/token', data=data) flask.session['credentials'] = r.text return flask.redirect(flask.url_for('index')) if __name__ == '__main__': import uuid app.secret_key = str(uuid.uuid4()) app.debug = False app.run()
रीडायरेक्ट यूआरआई की पुष्टि करने के नियम
यूआरआई को रीडायरेक्ट करने के लिए, Google यहां दिए गए, पुष्टि करने के इन नियमों को लागू करता है. इससे डेवलपर को अपने ऐप्लिकेशन को सुरक्षित रखने में मदद मिलती है. आपके रीडायरेक्ट यूआरआई को इन नियमों का पालन करना होगा. डोमेन, होस्ट, पाथ, क्वेरी, स्कीम, और उपयोगकर्ता की जानकारी की परिभाषा के लिए, आरएफ़सी 3986 सेक्शन 3 देखें.
सत्यापन नियम | |
---|---|
स्कीम |
रीडायरेक्ट यूआरआई को सामान्य एचटीटीपी के बजाय, एचटीटीपीएस स्कीम का इस्तेमाल करना चाहिए. लोकलहोस्ट के यूआरआई (इसमें लोकलहोस्ट के आईपी पते के यूआरआई शामिल हैं) पर यह नियम लागू नहीं होता है. |
होस्ट |
होस्ट, रॉ आईपी पते नहीं हो सकते. लोकलहोस्ट के आईपी पतों को यह नियम लागू करने की ज़रूरत नहीं है. |
डोमेन |
“googleusercontent.com” नहीं हो सकते.goo.gl ) शामिल नहीं किए जा सकते. इसके अलावा, अगर छोटा करने वाले डोमेन का मालिकाना हक रखने वाला कोई ऐप्लिकेशन उस डोमेन पर रीडायरेक्ट करता है, तो उस रीडायरेक्ट यूआरआई के पाथ में “/google-callback/” शामिल होना चाहिए या यह “/google-callback” पर खत्म होना चाहिए. |
उपयोगकर्ता की जानकारी |
रीडायरेक्ट यूआरआई में userinfo सबकॉम्पोनेंट नहीं हो सकता. |
पाथ |
रीडायरेक्ट यूआरआई में पाथ ट्रेवर्सल शामिल नहीं हो सकता. इसे डायरेक्ट्री बैकट्रैकिंग भी कहा जाता है.
इसे |
क्वेरी |
रीडायरेक्ट यूआरआई में ओपन रीडायरेक्ट शामिल नहीं हो सकते. |
फ़्रैगमेंट |
रीडायरेक्ट यूआरआई में फ़्रैगमेंट कॉम्पोनेंट शामिल नहीं हो सकता. |
वर्ण |
रीडायरेक्ट यूआरआई में कुछ वर्ण शामिल नहीं हो सकते, जैसे कि:
|
इंक्रीमेंटल अनुमति
OAuth 2.0 प्रोटोकॉल में, आपका ऐप्लिकेशन उन संसाधनों को ऐक्सेस करने के लिए अनुमति का अनुरोध करता है जिनकी पहचान स्कोप से की जाती है. जब आपको संसाधनों की ज़रूरत हो, तब इनके लिए अनुमति का अनुरोध करना, इसे उपयोगकर्ता के लिए सबसे सही तरीका माना जाता है. इस तरीके को चालू करने के लिए, Google का ऑथराइज़ेशन सर्वर, अतिरिक्त अनुमति देने की सुविधा देता है. इस सुविधा की मदद से, ज़रूरत पड़ने पर स्कोप के लिए अनुरोध किया जा सकता है. साथ ही, अगर उपयोगकर्ता नए दायरे के लिए अनुमति देता है, तो यह एक ऑथराइज़ेशन कोड दिखाता है. इसे किसी ऐसे टोकन से बदला जा सकता है जिसमें उपयोगकर्ता ने प्रोजेक्ट को दिए गए सभी दायरे हों.
उदाहरण के लिए, अगर किसी ऐप्लिकेशन में लोगों को म्यूज़िक ट्रैक का सैंपल बनाने और मिक्स बनाने की सुविधा मिलती है, तो हो सकता है कि साइन इन करते समय बहुत कम संसाधनों की ज़रूरत पड़े. ऐसा हो सकता है कि साइन इन करने वाले व्यक्ति के नाम के अलावा उसे कुछ और संसाधन की ज़रूरत न पड़े. हालांकि, पूरे हो चुके मिक्स को सेव करने के लिए, आपके Google Drive को ऐक्सेस करना होगा. ज़्यादातर लोगों को यह स्वाभाविक लगता है कि ऐप्लिकेशन को उस समय सिर्फ़ तब Google Drive का ऐक्सेस मांगा जाए जब ऐप्लिकेशन को इसकी ज़रूरत हो.
इस मामले में, साइन इन के समय ऐप्लिकेशन, बुनियादी साइन इन करने के लिए openid
और
profile
दायरे का अनुरोध कर सकता है. इसके बाद, बाद में मिक्स को सेव करने के पहले अनुरोध पर,
https://www.googleapis.com/auth/drive.file
दायरे का अनुरोध कर सकता है.
अनुमति बढ़ाने के अनुरोध को लागू करने के लिए, आपको सामान्य तरीके से ऐक्सेस टोकन का अनुरोध करना होता है. हालांकि, यह पक्का करें कि अनुमति के अनुरोध में पहले दिए गए स्कोप शामिल हों. इस तरीके से आपका ऐप्लिकेशन, एक से ज़्यादा ऐक्सेस टोकन मैनेज करने से बच सकता है.
बढ़ी हुई अनुमति से मिलने वाले ऐक्सेस टोकन पर ये नियम लागू होते हैं:
- इस टोकन का इस्तेमाल, अनुमति देने की नई और मिली-जुली अनुमति में रोल किए गए किसी भी स्कोप से जुड़े संसाधनों को ऐक्सेस करने के लिए किया जा सकता है.
- जब ऐक्सेस टोकन पाने के लिए, मिली-जुली अनुमति के लिए रीफ़्रेश टोकन का इस्तेमाल किया जाता है,
तो ऐक्सेस टोकन कंबाइंड ऑथराइज़ेशन को दिखाता है. इसका इस्तेमाल रिस्पॉन्स में शामिल किसी भी
scope
वैल्यू के लिए किया जा सकता है. - मिले-जुले अनुमति में वे सभी दायरे शामिल होते हैं जिन्हें उपयोगकर्ता ने एपीआई प्रोजेक्ट को दिया था. भले ही, अलग-अलग क्लाइंट से अनुमतियों का अनुरोध किया गया हो. उदाहरण के लिए, अगर किसी उपयोगकर्ता ने किसी ऐप्लिकेशन के डेस्कटॉप क्लाइंट का इस्तेमाल करके एक दायरे का ऐक्सेस दिया और फिर किसी मोबाइल क्लाइंट के ज़रिए उसी ऐप्लिकेशन को दूसरा स्कोप दिया, तो मिले-जुले अनुमति में दोनों स्कोप शामिल होंगे.
- अगर किसी ऐसे टोकन को रद्द किया जाता है जो मिली-जुली अनुमति को दिखाता है, तो जोड़े गए उपयोगकर्ता की ओर से उस अनुमति के सभी दायरों का ऐक्सेस, एक साथ रद्द कर दिया जाता है.
पहले चरण: ऑथराइज़ेशन पैरामीटर सेट करें में भाषा के हिसाब से सैंपल और दूसरा चरण: Google के OAuth 2.0 सर्वर पर रीडायरेक्ट करें सेक्शन में सैंपल एचटीटीपी/REST रीडायरेक्ट यूआरएल, इंक्रीमेंटल ऑथराइज़ेशन का इस्तेमाल करते हैं. नीचे दिए गए कोड सैंपल वह कोड भी दिखाते हैं जिसे आपको इंक्रीमेंटल ऑथराइज़ेशन का इस्तेमाल करने के लिए जोड़ना होगा.
PHP
$client->setIncludeGrantedScopes(true);
Python
Python में, include_granted_scopes
कीवर्ड आर्ग्युमेंट को true
पर सेट करें, ताकि
यह पक्का किया जा सके कि अनुमति के अनुरोध में पहले दिए गए स्कोप शामिल हैं. ऐसा हो सकता है कि
include_granted_scopes
, वह सिर्फ़ कीवर्ड आर्ग्युमेंट न हो जिसे आपने सेट किया है, जैसा कि
नीचे दिए गए उदाहरण में दिखाया गया है.
authorization_url, state = flow.authorization_url( # Enable offline access so that you can refresh an access token without # re-prompting the user for permission. Recommended for web server apps. access_type='offline', # Enable incremental authorization. Recommended as a best practice. include_granted_scopes='true')
Ruby
auth_client.update!( :additional_parameters => {"include_granted_scopes" => "true"} )
Node.js
const authorizationUrl = oauth2Client.generateAuthUrl({ // 'online' (default) or 'offline' (gets refresh_token) access_type: 'offline', /** Pass in the scopes array defined above. * Alternatively, if only one scope is needed, you can pass a scope URL as a string */ scope: scopes, // Enable incremental authorization. Recommended as a best practice. include_granted_scopes: true });
एचटीटीपी/REST
GET https://accounts.google.com/o/oauth2/v2/auth? client_id=your_client_id& response_type=code& state=state_parameter_passthrough_value& scope=https%3A//www.googleapis.com/auth/drive.file& redirect_uri=https%3A//oauth2.example.com/code& prompt=consent& include_granted_scopes=true
ऐक्सेस टोकन को रीफ़्रेश करना (ऑफ़लाइन ऐक्सेस)
ऐक्सेस टोकन की समयसीमा खत्म हो जाती है. ऐसे में, वे मिलते-जुलते एपीआई अनुरोध के लिए अमान्य क्रेडेंशियल बन जाते हैं. अगर आपने टोकन से जुड़े स्कोप के ऑफ़लाइन ऐक्सेस का अनुरोध किया है, तो उपयोगकर्ता से अनुमति के लिए अनुरोध किए बिना, ऐक्सेस टोकन को रीफ़्रेश किया जा सकता है. यह तब भी किया जा सकता है, जब उपयोगकर्ता मौजूद न हो.
- अगर Google API क्लाइंट लाइब्रेरी का इस्तेमाल किया जाता है, तो क्लाइंट ऑब्जेक्ट ज़रूरत के मुताबिक ऐक्सेस टोकन को तब तक रीफ़्रेश करता रहता है, जब तक उस ऑब्जेक्ट को ऑफ़लाइन ऐक्सेस के लिए कॉन्फ़िगर किया जाता है.
- अगर क्लाइंट लाइब्रेरी का इस्तेमाल नहीं किया जा रहा है, तो उपयोगकर्ता को Google के OAuth 2.0 सर्वर पर रीडायरेक्ट करते समय, आपको
access_type
एचटीटीपी क्वेरी पैरामीटर कोoffline
पर सेट करना होगा. ऐसे मामले में, जब ऐक्सेस टोकन के लिए ऑथराइज़ेशन कोड की अदला-बदली की जाती है, तो Google का ऑथराइज़ेशन सर्वर एक रीफ़्रेश टोकन दिखाता है. इसके बाद, अगर ऐक्सेस टोकन की समयसीमा खत्म हो जाती है या किसी और समय पर उसका इस्तेमाल किया जाता है, तो नया ऐक्सेस टोकन पाने के लिए रीफ़्रेश टोकन का इस्तेमाल किया जा सकता है.
ऐसे किसी भी ऐप्लिकेशन को ऑफ़लाइन ऐक्सेस का अनुरोध करना ज़रूरी होता है जिसे उपयोगकर्ता के मौजूद न होने पर, Google
API को ऐक्सेस करने की ज़रूरत होती है. उदाहरण के लिए, ऐसा ऐप्लिकेशन जो बैकअप लेने की सेवाएं देता है या पहले से तय समय पर कार्रवाइयां करता है, उसे उपयोगकर्ता के मौजूद न होने पर, अपने ऐक्सेस टोकन को रीफ़्रेश
करने की अनुमति होनी चाहिए. ऐक्सेस की डिफ़ॉल्ट स्टाइल को online
कहा जाता है.
अनुमति देने की प्रोसेस के दौरान, सर्वर साइड वेब ऐप्लिकेशन, इंस्टॉल किए गए ऐप्लिकेशन, और डिवाइस को रीफ़्रेश टोकन मिलते हैं. आम तौर पर, क्लाइंट-साइड (JavaScript) वेब ऐप्लिकेशन में रीफ़्रेश टोकन का इस्तेमाल नहीं किया जाता.
PHP
अगर आपके ऐप्लिकेशन को Google API का ऑफ़लाइन ऐक्सेस चाहिए, तो एपीआई क्लाइंट के ऐक्सेस टाइप को
offline
पर सेट करें:
$client->setAccessType("offline");
जब कोई उपयोगकर्ता अनुरोध किए गए दायरों का ऑफ़लाइन ऐक्सेस देता है, तब उसके ऑफ़लाइन होने पर भी उपयोगकर्ता की ओर से Google API को ऐक्सेस करने के लिए, एपीआई क्लाइंट का इस्तेमाल जारी रखा जा सकता है. क्लाइंट ऑब्जेक्ट, ज़रूरत के मुताबिक ऐक्सेस टोकन को रीफ़्रेश करेगा.
Python
Python में, access_type
कीवर्ड आर्ग्युमेंट को offline
पर सेट करें, ताकि यह पक्का किया जा सके कि
आपके पास ऐक्सेस टोकन को रीफ़्रेश करने का विकल्प है. इसके लिए, उपयोगकर्ता को फिर से अनुमति लेने की ज़रूरत नहीं है. ऐसा हो सकता है कि access_type
, वह सिर्फ़ कीवर्ड आर्ग्युमेंट न हो जिसे आपने सेट किया है, जैसा कि यहां दिए गए उदाहरण में दिखाया गया है.
authorization_url, state = flow.authorization_url( # Enable offline access so that you can refresh an access token without # re-prompting the user for permission. Recommended for web server apps. access_type='offline', # Enable incremental authorization. Recommended as a best practice. include_granted_scopes='true')
जब कोई उपयोगकर्ता अनुरोध किए गए दायरों का ऑफ़लाइन ऐक्सेस देता है, तब उसके ऑफ़लाइन होने पर भी उपयोगकर्ता की ओर से Google API को ऐक्सेस करने के लिए, एपीआई क्लाइंट का इस्तेमाल जारी रखा जा सकता है. क्लाइंट ऑब्जेक्ट, ज़रूरत के मुताबिक ऐक्सेस टोकन को रीफ़्रेश करेगा.
Ruby
अगर आपके ऐप्लिकेशन को Google API का ऑफ़लाइन ऐक्सेस चाहिए, तो एपीआई क्लाइंट के ऐक्सेस टाइप को
offline
पर सेट करें:
auth_client.update!( :additional_parameters => {"access_type" => "offline"} )
जब कोई उपयोगकर्ता अनुरोध किए गए दायरों का ऑफ़लाइन ऐक्सेस देता है, तब उसके ऑफ़लाइन होने पर भी उपयोगकर्ता की ओर से Google API को ऐक्सेस करने के लिए, एपीआई क्लाइंट का इस्तेमाल जारी रखा जा सकता है. क्लाइंट ऑब्जेक्ट, ज़रूरत के मुताबिक ऐक्सेस टोकन को रीफ़्रेश करेगा.
Node.js
अगर आपके ऐप्लिकेशन को Google API का ऑफ़लाइन ऐक्सेस चाहिए, तो एपीआई क्लाइंट के ऐक्सेस टाइप को
offline
पर सेट करें:
const authorizationUrl = oauth2Client.generateAuthUrl({ // 'online' (default) or 'offline' (gets refresh_token) access_type: 'offline', /** Pass in the scopes array defined above. * Alternatively, if only one scope is needed, you can pass a scope URL as a string */ scope: scopes, // Enable incremental authorization. Recommended as a best practice. include_granted_scopes: true });
जब कोई उपयोगकर्ता अनुरोध किए गए दायरों का ऑफ़लाइन ऐक्सेस देता है, तब उसके ऑफ़लाइन होने पर भी उपयोगकर्ता की ओर से Google API को ऐक्सेस करने के लिए, एपीआई क्लाइंट का इस्तेमाल जारी रखा जा सकता है. क्लाइंट ऑब्जेक्ट, ज़रूरत के मुताबिक ऐक्सेस टोकन को रीफ़्रेश करेगा.
ऐक्सेस टोकन की समयसीमा खत्म हो जाती है. अगर समयसीमा खत्म होने वाली है, तो यह लाइब्रेरी अपने-आप रीफ़्रेश टोकन का इस्तेमाल करके, नया ऐक्सेस टोकन हासिल करेगी. टोकन इवेंट का इस्तेमाल करना, यह पक्का करने का एक आसान तरीका है कि आप हमेशा सबसे हाल के टोकन सेव करें:
oauth2Client.on('tokens', (tokens) => { if (tokens.refresh_token) { // store the refresh_token in your secure persistent database console.log(tokens.refresh_token); } console.log(tokens.access_token); });
यह टोकन इवेंट सिर्फ़ पहली बार अनुमति देने पर होता है. रीफ़्रेश टोकन पाने के लिए, आपको generateAuthUrl
तरीके को कॉल करते समय access_type
को offline
पर सेट करना होगा. अगर आपने रीफ़्रेश टोकन पाने के लिए सही पाबंदियां सेट किए बिना पहले ही अपने ऐप्लिकेशन को ज़रूरी अनुमतियां
दे दी हैं, तो आपको नया रीफ़्रेश टोकन पाने के लिए, ऐप्लिकेशन को
फिर से अनुमति देनी होगी.
refresh_token
को बाद में सेट करने के लिए, setCredentials
तरीके का इस्तेमाल करें:
oauth2Client.setCredentials({ refresh_token: `STORED_REFRESH_TOKEN` });
क्लाइंट को रीफ़्रेश टोकन मिलने के बाद, एपीआई को अगले कॉल में ऐक्सेस टोकन अपने-आप मिल जाएंगे और रीफ़्रेश हो जाएंगे.
एचटीटीपी/REST
ऐक्सेस टोकन को रीफ़्रेश करने के लिए, आपका ऐप्लिकेशन Google के ऑथराइज़ेशन सर्वर (https://oauth2.googleapis.com/token
) पर एचटीटीपीएस POST
अनुरोध भेजता है. इस अनुरोध में ये पैरामीटर शामिल होते हैं:
फ़ील्ड | |
---|---|
client_id |
API Consoleसे मिला क्लाइंट आईडी. |
client_secret |
API Consoleसे मिला क्लाइंट सीक्रेट. |
grant_type |
जैसा कि OAuth 2.0
स्पेसिफ़िकेशन में बताया गया है,
इस फ़ील्ड की वैल्यू refresh_token पर सेट होनी चाहिए. |
refresh_token |
रीफ़्रेश टोकन, ऑथराइज़ेशन कोड एक्सचेंज से मिला है. |
नीचे दिया गया स्निपेट, अनुरोध का एक नमूना दिखाता है:
POST /token HTTP/1.1 Host: oauth2.googleapis.com Content-Type: application/x-www-form-urlencoded client_id=your_client_id& client_secret=your_client_secret& refresh_token=refresh_token& grant_type=refresh_token
जब तक उपयोगकर्ता, ऐप्लिकेशन को दिए गए ऐक्सेस को वापस नहीं लेता, तब तक टोकन सर्वर एक JSON ऑब्जेक्ट दिखाता है, जिसमें नया ऐक्सेस टोकन होता है. यह स्निपेट एक सैंपल रिस्पॉन्स दिखाता है:
{ "access_token": "1/fFAGRNJru1FTz70BzhT3Zg", "expires_in": 3920, "scope": "https://www.googleapis.com/auth/drive.metadata.readonly", "token_type": "Bearer" }
ध्यान दें कि जारी किए जाने वाले रीफ़्रेश टोकन की संख्या सीमित है; हर क्लाइंट/उपयोगकर्ता कॉम्बिनेशन के लिए एक सीमा और सभी क्लाइंट के लिए हर उपयोगकर्ता के हिसाब से दूसरी सीमा. आपको रीफ़्रेश टोकन को लंबे समय तक इस्तेमाल करने वाले स्टोरेज में सेव करना चाहिए. साथ ही, जब तक वे मान्य हैं, तब तक उनका इस्तेमाल करते रहना चाहिए. अगर आपका ऐप्लिकेशन, बहुत ज़्यादा रीफ़्रेश टोकन का अनुरोध करता है, तो वह इन सीमाओं के दायरे में आ सकता है. ऐसे में, पुराने रीफ़्रेश टोकन काम करना बंद कर देंगे.
टोकन को रद्द करना
कुछ स्थितियों में उपयोगकर्ता किसी ऐप्लिकेशन को दिया गया ऐक्सेस वापस लेना चाह सकता है. उपयोगकर्ता खाता सेटिंग पर जाकर, ऐक्सेस वापस ले सकता है. ज़्यादा जानकारी के लिए, तीसरे पक्ष की उन साइटों और ऐप्लिकेशन का साइट या ऐप्लिकेशन ऐक्सेस हटाएं जिनके पास आपके खाते का ऐक्सेस है सहायता दस्तावेज़ देखें.
किसी ऐप्लिकेशन को दिए गए ऐक्सेस को प्रोग्राम के हिसाब से रद्द कर पाना भी संभव है. प्रोग्राम के हिसाब से अपने-आप होने वाली प्रोसेस को रद्द करना तब ज़रूरी है, जब कोई उपयोगकर्ता सदस्यता छोड़ता है, किसी ऐप्लिकेशन को हटाता है या किसी ऐप्लिकेशन के लिए ज़रूरी एपीआई के संसाधनों में काफ़ी बदलाव होता है. इसका मतलब है कि कॉन्टेंट हटाने की प्रोसेस में, एपीआई अनुरोध भी शामिल हो सकता है. ऐसा करके, यह पक्का किया जाता है कि ऐप्लिकेशन को पहले दी गई अनुमतियां हटा दी गई हों.
PHP
किसी टोकन को प्रोग्राम के हिसाब से रद्द करने के लिए, revokeToken()
को कॉल करें:
$client->revokeToken();
Python
किसी टोकन को प्रोग्राम के ज़रिए हटाने के लिए,
https://oauth2.googleapis.com/revoke
को एक अनुरोध करें, जिसमें टोकन को पैरामीटर के तौर पर शामिल किया गया हो. साथ ही,
Content-Type
हेडर को सेट करें:
requests.post('https://oauth2.googleapis.com/revoke', params={'token': credentials.token}, headers = {'content-type': 'application/x-www-form-urlencoded'})
Ruby
किसी टोकन को प्रोग्राम के हिसाब से, अपने-आप रद्द करने के लिए, oauth2.revoke
एंडपॉइंट पर एचटीटीपी अनुरोध करें:
uri = URI('https://oauth2.googleapis.com/revoke') response = Net::HTTP.post_form(uri, 'token' => auth_client.access_token)
यह टोकन, ऐक्सेस टोकन या रीफ़्रेश टोकन हो सकता है. अगर टोकन कोई ऐक्सेस टोकन है और उससे जुड़ा रीफ़्रेश टोकन मौजूद है, तो रीफ़्रेश टोकन भी वापस ले लिया जाएगा.
अगर सहमति रद्द हो जाती है, तो जवाब का स्टेटस कोड
200
होता है. गड़बड़ी की स्थितियों के लिए, गड़बड़ी कोड के साथ एक स्टेटस कोड 400
दिखाया जाता है.
Node.js
किसी टोकन को प्रोग्राम के हिसाब से रद्द करने के लिए, /revoke
एंडपॉइंट पर एचटीटीपीएस पोस्ट अनुरोध करें:
const https = require('https'); // Build the string for the POST request let postData = "token=" + userCredential.access_token; // Options for POST request to Google's OAuth 2.0 server to revoke a token let postOptions = { host: 'oauth2.googleapis.com', port: '443', path: '/revoke', method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'Content-Length': Buffer.byteLength(postData) } }; // Set up the request const postReq = https.request(postOptions, function (res) { res.setEncoding('utf8'); res.on('data', d => { console.log('Response: ' + d); }); }); postReq.on('error', error => { console.log(error) }); // Post the request with data postReq.write(postData); postReq.end();
टोकन पैरामीटर, ऐक्सेस टोकन या रीफ़्रेश टोकन हो सकता है. अगर टोकन कोई ऐक्सेस टोकन है और उससे जुड़ा रीफ़्रेश टोकन मौजूद है, तो रीफ़्रेश टोकन भी वापस ले लिया जाएगा.
अगर सहमति रद्द हो जाती है, तो जवाब का स्टेटस कोड
200
होता है. गड़बड़ी की स्थितियों के लिए, गड़बड़ी कोड के साथ एक स्टेटस कोड 400
दिखाया जाता है.
एचटीटीपी/REST
प्रोग्राम के ज़रिए किसी टोकन को रद्द करने के लिए, आपका ऐप्लिकेशन https://oauth2.googleapis.com/revoke
को अनुरोध करता है और टोकन को पैरामीटर के तौर पर शामिल करता है:
curl -d -X -POST --header "Content-type:application/x-www-form-urlencoded" \ https://oauth2.googleapis.com/revoke?token={token}
यह टोकन, ऐक्सेस टोकन या रीफ़्रेश टोकन हो सकता है. अगर टोकन कोई ऐक्सेस टोकन है और उससे जुड़ा रीफ़्रेश टोकन मौजूद है, तो रीफ़्रेश टोकन भी वापस ले लिया जाएगा.
अगर सहमति रद्द हो जाती है, तो रिस्पॉन्स का एचटीटीपी स्टेटस कोड
200
होगा. गड़बड़ी की स्थितियों के लिए, एक एचटीटीपी स्टेटस कोड 400
, गड़बड़ी कोड के साथ दिखाया जाता है.