इस दस्तावेज़ में बताया गया है कि वेब सर्वर ऐप्लिकेशन, Google API क्लाइंट लाइब्रेरी या Google OAuth 2.0 एंडपॉइंट का इस्तेमाल कैसे करते हैं, ताकि Google API को ऐक्सेस करने के लिए, OAuth 2.0 की अनुमति लागू की जा सके.
OAuth 2.0, उपयोगकर्ताओं को अपने उपयोगकर्ता नाम, पासवर्ड, और दूसरी जानकारी को निजी रखते हुए, किसी ऐप्लिकेशन के साथ खास डेटा शेयर करने की सुविधा देता है. जैसे, कोई ऐप्लिकेशन, उपयोगकर्ताओं से अपने Google Drive में फ़ाइलें सेव करने की अनुमति लेने के लिए, OAuth 2.0 का इस्तेमाल कर सकता है.
यह 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 एपीआई के स्कोप वाले दस्तावेज़ में उन दायरों की पूरी सूची होती है जिनका इस्तेमाल, 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
- फ़्लास्क 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
इस उदाहरण में, फ़्लास्क वेब ऐप्लिकेशन फ़्रेमवर्क का इस्तेमाल करके, उपयोगकर्ता को अनुमति देने वाले यूआरएल पर रीडायरेक्ट करने का तरीका बताया गया है:
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 Workspace एडमिन की नीतियों की वजह से, Google खाते के पास अनुरोध किए गए एक या उससे ज़्यादा स्कोप को अनुमति नहीं है. Google Workspace एडमिन का सहायता लेख पढ़ें तीसरे पक्ष और आपके डोमेन के मालिकाना हक वाले किन ऐप्लिकेशन से Google Workspace का डेटा ऐक्सेस किया जा सकता है, इसे कंट्रोल करना इस बारे में ज़्यादा जानकारी पाएं कि एडमिन आपके OAuth क्लाइंट आईडी को साफ़ तौर पर ऐक्सेस देने तक, सभी दायरों या संवेदनशील और पाबंदी वाले दायरों के ऐक्सेस पर पाबंदी कैसे लगा सकता है.
disallowed_useragent
ऑथराइज़ेशन एंडपॉइंट, एम्बेड किए गए ऐसे उपयोगकर्ता एजेंट के अंदर दिखाया जाता है जिसे Google की OAuth 2.0 नीतियों के मुताबिक अनुमति नहीं है.
Android
Android डेवलपर को
android.webkit.WebView
में अनुमति के अनुरोध खोलते समय, गड़बड़ी का यह मैसेज मिल सकता है.
इसके बजाय, डेवलपर को Android लाइब्रेरी का इस्तेमाल करना चाहिए. जैसे,
Android के लिए 'Google साइन-इन' या OpenID Foundation का
Android के लिए AppAuth.
वेब डेवलपर को यह गड़बड़ी तब दिख सकती है, जब कोई Android ऐप्लिकेशन, एम्बेड किए गए उपयोगकर्ता-एजेंट में सामान्य वेब लिंक खोलता है और उपयोगकर्ता आपकी साइट से Google के OAuth 2.0 ऑथराइज़ेशन एंडपॉइंट पर नेविगेट करता है. डेवलपर को चाहिए कि वे ऑपरेटिंग सिस्टम के डिफ़ॉल्ट लिंक हैंडलर में सामान्य लिंक खोलने की अनुमति दें. इनमें Android ऐप्लिकेशन के लिंक हैंडलर या डिफ़ॉल्ट ब्राउज़र ऐप्लिकेशन, दोनों शामिल हैं. Android के कस्टम टैब की लाइब्रेरी भी इस्तेमाल की जा सकती है.
iOS
iOS और macOS डेवलपर को WKWebView
में अनुमति के अनुरोध खोलते समय यह गड़बड़ी दिख सकती है.
इसके बजाय, डेवलपर को
iOS के लिए Google साइन-इन या OpenID Foundation की
AppAuth for iOS जैसी iOS लाइब्रेरी का इस्तेमाल करना चाहिए.
वेब डेवलपर को यह गड़बड़ी तब दिख सकती है, जब कोई 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 देखें.
सत्यापन नियम | |
---|---|
स्कीम |
रीडायरेक्ट यूआरआई को सामान्य एचटीटीपी के बजाय, एचटीटीपीएस स्कीम का इस्तेमाल करना चाहिए. लोकलहोस्ट यूआरआई (इसमें लोकलहोस्ट का आईपी पता भी शामिल है) को इस नियम से छूट दी गई है. |
होस्ट |
होस्ट, रॉ आईपी पते नहीं हो सकते. Localhost आईपी पतों को इस नियम से छूट दी गई है. |
डोमेन |
“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
वैल्यू के लिए किया जा सकता है. - मिली-जुली अनुमति में वे सभी दायरे शामिल होते हैं जिन्हें उपयोगकर्ता ने एपीआई प्रोजेक्ट को दिया था. भले ही, अनुरोधों को अलग-अलग क्लाइंट से मांगा गया हो. उदाहरण के लिए, अगर कोई उपयोगकर्ता किसी ऐप्लिकेशन के डेस्कटॉप क्लाइंट का इस्तेमाल करके एक स्कोप का ऐक्सेस देता है और फिर मोबाइल क्लाइंट के ज़रिए उसी ऐप्लिकेशन को दूसरा स्कोप देता है, तो मिले-जुले अनुमति में दोनों स्कोप शामिल होंगे.
- अगर अनुमति को एक साथ दिखाने वाले किसी टोकन को रद्द किया जाता है, तो संबंधित उपयोगकर्ता की ओर से, उस अनुमति के सभी दायरों का ऐक्सेस एक साथ रद्द कर दिया जाएगा.
पहले चरण में भाषा के हिसाब से कोड सैंपल: अनुमति देने वाले पैरामीटर सेट करें और दूसरे चरण में एचटीटीपी/REST रीडायरेक्ट यूआरएल का नमूना: Google के OAuth 2.0 सर्वर पर रीडायरेक्ट करें, सभी इंक्रीमेंटल ऑथराइज़ेशन का इस्तेमाल करते हैं. नीचे दिए गए कोड सैंपल वह कोड भी दिखाते हैं जिसे आपको इंक्रीमेंटल ऑथराइज़ेशन का इस्तेमाल करने के लिए जोड़ना होगा.
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
, गड़बड़ी कोड के साथ
दिखाया जाता है.