इस दस्तावेज़ में बताया गया है कि वेब सर्वर ऐप्लिकेशन, YouTube Data API को ऐक्सेस करने के लिए, OAuth 2.0 ऑथराइज़ेशन को लागू करने के लिए, Google API क्लाइंट लाइब्रेरी या Google OAuth 2.0 एंडपॉइंट का इस्तेमाल कैसे करते हैं.
OAuth 2.0 की मदद से उपयोगकर्ता, किसी ऐप्लिकेशन के साथ कुछ खास डेटा शेयर कर सकते हैं. हालांकि, इस दौरान उनके उपयोगकर्ता नाम, पासवर्ड, और अन्य जानकारी निजी रहती है. उदाहरण के लिए, कोई ऐप्लिकेशन OAuth 2.0 का इस्तेमाल करके, किसी उपयोगकर्ता के YouTube चैनल पर वीडियो अपलोड करने की अनुमति पा सकता है.
यह OAuth 2.0 फ़्लो, खास तौर पर उपयोगकर्ता के ऑथराइज़ेशन के लिए होता है. इसे ऐसे ऐप्लिकेशन के लिए डिज़ाइन किया गया है जो गोपनीय जानकारी को सेव कर सकते हैं और उसकी स्थिति को बनाए रख सकते हैं. सही तरीके से अनुमति पा चुका वेब सर्वर ऐप्लिकेशन, एपीआई को ऐक्सेस कर सकता है. ऐसा तब होता है, जब उपयोगकर्ता ऐप्लिकेशन से इंटरैक्ट कर रहा हो या जब उपयोगकर्ता ऐप्लिकेशन छोड़ चुका हो.
वेब सर्वर ऐप्लिकेशन भी अक्सर
सेवा खातों का इस्तेमाल करते हैं, ताकि एपीआई के अनुरोधों को अनुमति दी जा सके. खास तौर पर, Cloud API को कॉल करते समय, उपयोगकर्ता के हिसाब से डेटा के बजाय प्रोजेक्ट के हिसाब से डेटा को ऐक्सेस करने के लिए ऐसा किया जाता है. वेब सर्वर ऐप्लिकेशन, उपयोगकर्ता की अनुमति के साथ-साथ सेवा खातों का इस्तेमाल कर सकते हैं.
ध्यान दें कि YouTube Data API, सेवा खाते के फ़्लो का इस्तेमाल सिर्फ़ उन YouTube कॉन्टेंट के मालिकों के लिए करता है जिनके पास एक से ज़्यादा YouTube चैनलों का मालिकाना हक है और वे उन्हें मैनेज करते हैं.
खास तौर पर, कॉन्टेंट के मालिक सेवा खातों का इस्तेमाल करके, एपीआई के उन तरीकों को कॉल कर सकते हैं जो onBehalfOfContentOwner
अनुरोध पैरामीटर के साथ काम करते हैं.
क्लाइंट लाइब्रेरी
इस पेज पर, भाषा के हिसाब से दिए गए उदाहरणों में, OAuth 2.0 ऑथराइज़ेशन को लागू करने के लिए Google API क्लाइंट लाइब्रेरी का इस्तेमाल किया गया है. कोड के सैंपल चलाने के लिए, आपको सबसे पहले अपनी भाषा के लिए क्लाइंट लाइब्रेरी इंस्टॉल करनी होगी.
जब अपने ऐप्लिकेशन के OAuth 2.0 फ़्लो को मैनेज करने के लिए, Google API क्लाइंट लाइब्रेरी का इस्तेमाल किया जाता है, तो क्लाइंट लाइब्रेरी कई ऐसे काम करती है जिन्हें ऐप्लिकेशन को खुद मैनेज करना होता है. उदाहरण के लिए, इससे यह तय होता है कि ऐप्लिकेशन, सेव किए गए ऐक्सेस टोकन का इस्तेमाल कब कर सकता है या उन्हें कब रीफ़्रेश कर सकता है. साथ ही, इससे यह भी तय होता है कि ऐप्लिकेशन को सहमति फिर से कब लेनी होगी. क्लाइंट लाइब्रेरी, सही रीडायरेक्ट यूआरएल भी जनरेट करती है. साथ ही, यह रीडायरेक्ट हैंडलर लागू करने में मदद करती है. ये हैंडलर, ऑथराइज़ेशन कोड के बदले ऐक्सेस टोकन देते हैं.
सर्वर-साइड ऐप्लिकेशन के लिए, Google API की क्लाइंट लाइब्रेरी इन भाषाओं में उपलब्ध हैं:
ज़रूरी शर्तें
अपने प्रोजेक्ट के लिए एपीआई चालू करना
Google API को कॉल करने वाले किसी भी ऐप्लिकेशन को, API Consoleमें उन एपीआई को चालू करना होगा.
अपने प्रोजेक्ट के लिए कोई एपीआई चालू करने के लिए:
- Open the API Library में Google API Console.
- If prompted, select a project, or create a new one.
- YouTube Data API ढूंढने और उसे चालू करने के लिए, लाइब्रेरी पेज का इस्तेमाल करें. अपने ऐप्लिकेशन के लिए इस्तेमाल किए जाने वाले अन्य एपीआई ढूंढें और उन्हें भी चालू करें.
अनुमति देने वाले क्रेडेंशियल बनाना
Google APIs को ऐक्सेस करने के लिए OAuth 2.0 का इस्तेमाल करने वाले किसी भी ऐप्लिकेशन के पास अनुमति देने वाले क्रेडेंशियल होने चाहिए. इनसे Google के OAuth 2.0 सर्वर पर ऐप्लिकेशन की पहचान होती है. यहां दिए गए तरीके से, अपने प्रोजेक्ट के लिए क्रेडेंशियल बनाए जा सकते हैं. इसके बाद, आपके ऐप्लिकेशन इन क्रेडेंशियल का इस्तेमाल करके, उन एपीआई को ऐक्सेस कर सकते हैं जिन्हें आपने उस प्रोजेक्ट के लिए चालू किया है.
- Go to the Credentials page.
- क्लाइंट बनाएं पर क्लिक करें.
- ऐप्लिकेशन टाइप के तौर पर वेब ऐप्लिकेशन चुनें.
- फ़ॉर्म भरें और बनाएं पर क्लिक करें. PHP, Java, Python, Ruby, और .NET जैसी भाषाओं और फ़्रेमवर्क का इस्तेमाल करने वाले ऐप्लिकेशन को, अनुमति वाले रीडायरेक्ट यूआरआई के बारे में बताना होगा. रीडायरेक्ट यूआरआई ऐसे एंडपॉइंट होते हैं जिन पर OAuth 2.0 सर्वर, जवाब भेज सकता है. इन
एंडपॉइंट को Google के पुष्टि करने के नियमों का पालन करना होगा.
जांच के लिए, लोकल मशीन से जुड़े यूआरआई तय किए जा सकते हैं. जैसे,
http://localhost:8080
. इसलिए, कृपया ध्यान दें कि इस दस्तावेज़ में दिए गए सभी उदाहरणों में, रीडायरेक्ट यूआरआई के तौर परhttp://localhost:8080
का इस्तेमाल किया गया है.हमारा सुझाव है कि आप अपने ऐप्लिकेशन के पुष्टि करने वाले एंडपॉइंट डिज़ाइन करें, ताकि आपका ऐप्लिकेशन पेज पर मौजूद अन्य संसाधनों को अनुमति देने वाले कोड न दिखाए.
क्रेडेंशियल बनाने के बाद, API Consoleसे client_secret.json फ़ाइल डाउनलोड करें. फ़ाइल को ऐसी जगह पर सुरक्षित तरीके से सेव करें जहां से सिर्फ़ आपका ऐप्लिकेशन इसे ऐक्सेस कर सके.
ऐक्सेस स्कोप की पहचान करना
स्कोप की मदद से, आपका ऐप्लिकेशन सिर्फ़ उन संसाधनों का ऐक्सेस मांग सकता है जिनकी उसे ज़रूरत है. साथ ही, इससे उपयोगकर्ताओं को यह कंट्रोल करने की सुविधा मिलती है कि वे आपके ऐप्लिकेशन को कितना ऐक्सेस दें. इसलिए, अनुरोध किए गए स्कोप की संख्या और उपयोगकर्ता की सहमति मिलने की संभावना के बीच उलटा संबंध हो सकता है.
OAuth 2.0 ऑथराइज़ेशन लागू करने से पहले, हमारा सुझाव है कि आप उन स्कोप की पहचान करें जिनके लिए आपके ऐप्लिकेशन को ऐक्सेस करने की अनुमति चाहिए होगी.
हम यह भी सुझाव देते हैं कि आपका ऐप्लिकेशन, ज़्यादा अनुमति मांगने की सुविधा की मदद से, अनुमति के दायरे को ऐक्सेस करने का अनुरोध करे. इस सुविधा में, आपका ऐप्लिकेशन, उपयोगकर्ता के डेटा को ऐक्सेस करने का अनुरोध करता है. इस सबसे सही तरीके से, लोगों को यह समझने में आसानी होती है कि आपके ऐप्लिकेशन को उस डेटा का ऐक्सेस क्यों चाहिए जिसके लिए वह अनुरोध कर रहा है.
YouTube Data API v3, इन स्कोप का इस्तेमाल करता है:
दायरा | ब्यौरा |
---|---|
https://www. |
अपना YouTube खाता मैनेज करें |
https://www. |
अपने चैनल के मौजूदा सक्रिय सदस्यों की सूची और उनका मौजूदा लेवल देखें. यह भी देखें कि वे चैनल के सदस्य कब बने |
https://www. |
अपने YouTube वीडियो की रेटिंग, टिप्पणियां और कैप्शन देखें, उनमें बदलाव करें और उन्हें हमेशा के लिए मिटाएं |
https://www. |
अपना YouTube खाता देखें |
https://www. |
अपने YouTube वीडियो मैनेज करें |
https://www. |
YouTube पर अपनी परिसंपत्ति और संबंधित सामग्री देखें व प्रबंधित करें |
https://www. |
किसी YouTube भागीदार की ऑडिट प्रक्रिया के दौरान उससे प्रासंगिक अपने YouTube चैनल की निजी जानकारी देखें |
OAuth 2.0 API स्कोप दस्तावेज़ में, उन स्कोप की पूरी सूची दी गई है जिनका इस्तेमाल करके, Google API को ऐक्सेस किया जा सकता है.
भाषा के हिसाब से ज़रूरी शर्तें
इस दस्तावेज़ में दिए गए किसी भी कोड सैंपल को चलाने के लिए, आपके पास एक Google खाता, इंटरनेट का ऐक्सेस, और एक वेब ब्राउज़र होना चाहिए. अगर इनमें से किसी एपीआई क्लाइंट लाइब्रेरी का इस्तेमाल किया जा रहा है, तो यहां दी गई भाषा के हिसाब से ज़रूरी शर्तें भी देखें.
PHP
इस दस्तावेज़ में दिए गए PHP कोड के सैंपल चलाने के लिए, आपको इनकी ज़रूरत होगी:
- PHP 8.0 या उसके बाद का वर्शन. साथ ही, कमांड-लाइन इंटरफ़ेस (सीएलआई) और JSON एक्सटेंशन इंस्टॉल होना चाहिए.
- डिपेंडेंसी मैनेज करने वाला Composer टूल.
-
PHP के लिए Google APIs क्लाइंट लाइब्रेरी:
composer require google/apiclient:^2.15.0
ज़्यादा जानकारी के लिए, PHP के लिए Google API की क्लाइंट लाइब्रेरी देखें.
Python
इस दस्तावेज़ में दिए गए Python कोड के सैंपल चलाने के लिए, आपको इनकी ज़रूरत होगी:
- Python 3.7 या इसके बाद का वर्शन
- pip पैकेज मैनेजमेंट टूल.
- Google APIs Client Library for Python 2.0 रिलीज़:
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
- Flask, Python का वेब ऐप्लिकेशन फ़्रेमवर्क है.
pip install --upgrade flask
requests
एचटीटीपी लाइब्रेरी.pip install --upgrade requests
अगर आपको Python और उससे जुड़ी माइग्रेशन गाइड को अपग्रेड करने में समस्या आ रही है, तो Google API की Python क्लाइंट लाइब्रेरी का रिलीज़ नोट देखें.
Ruby
इस दस्तावेज़ में दिए गए Ruby कोड के सैंपल चलाने के लिए, आपके पास ये चीज़ें होनी चाहिए:
- Ruby 2.6 या इसके बाद का वर्शन
-
Ruby के लिए Google Auth Library:
gem install googleauth
-
Sinatra Ruby वेब ऐप्लिकेशन फ़्रेमवर्क.
gem install sinatra
Node.js
इस दस्तावेज़ में दिए गए Node.js कोड सैंपल चलाने के लिए, आपको इनकी ज़रूरत होगी:
- Node.js का रखरखाव वाला एलटीएस वर्शन, चालू एलटीएस वर्शन या मौजूदा रिलीज़.
-
Google APIs Node.js क्लाइंट:
npm install googleapis crypto express express-session
एचटीटीपी/रेस्ट
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
पैरामीटर सेट करता है.
उदाहरण के लिए, यह कोड किसी उपयोगकर्ता के YouTube खाते को मैनेज करने के लिए, ऑफ़लाइन ऐक्सेस का अनुरोध करता है:
use Google\Client; $client = new Client(); // Required, call the setAuthConfig function to load authorization credentials from // client_secret.json file. $client->setAuthConfig('client_secret.json'); // Required, to set the scope value, call the addScope function $client->addScope(GOOGLE_SERVICE_YOUTUBE::YOUTUBE_FORCE_SSL); // Required, call the setRedirectUri function to specify a valid redirect URI for the // provided client_id $client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php'); // Recommended, 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'); // Recommended, call the setState function. Using a state value can increase your assurance that // an incoming connection is the result of an authentication request. $client->setState($sample_passthrough_value); // Optional, if your application knows which user is trying to authenticate, it can use this // parameter to provide a hint to the Google Authentication Server. $client->setLoginHint('hint@example.com'); // Optional, call the setPrompt function to set "consent" will prompt the user for consent $client->setPrompt('consent'); // Optional, call the setIncludeGrantedScopes function with true to enable incremental // authorization $client->setIncludeGrantedScopes(true);
Python
नीचे दिए गए कोड स्निपेट में, google-auth-oauthlib.flow
मॉड्यूल का इस्तेमाल करके, अनुमति का अनुरोध तैयार किया गया है.
यह कोड, Flow
ऑब्जेक्ट बनाता है. यह ऑब्जेक्ट, client_secret.json फ़ाइल से मिली जानकारी का इस्तेमाल करके आपके ऐप्लिकेशन की पहचान करता है. इस फ़ाइल को आपने अनुमति देने के क्रेडेंशियल बनाने के बाद डाउनलोड किया था. इस ऑब्जेक्ट से उन स्कोप की भी पहचान होती है जिन्हें ऐक्सेस करने की अनुमति आपका ऐप्लिकेशन मांग रहा है. साथ ही, इससे आपके ऐप्लिकेशन के ऑथराइज़ेशन एंडपॉइंट का यूआरएल भी पता चलता है. यह यूआरएल, Google के OAuth 2.0 सर्वर से मिले जवाब को हैंडल करेगा. आखिर में, कोड वैकल्पिक access_type
और include_granted_scopes
पैरामीटर सेट करता है.
उदाहरण के लिए, यह कोड किसी उपयोगकर्ता के YouTube खाते को मैनेज करने के लिए, ऑफ़लाइन ऐक्सेस का अनुरोध करता है:
import google.oauth2.credentials import google_auth_oauthlib.flow # Required, call the from_client_secrets_file method to retrieve the client ID from a # client_secret.json file. The client ID (from that file) and access scopes are required. (You can # also use the from_client_config method, which passes the client configuration as it originally # appeared in a client secrets file but doesn't access the file itself.) flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file('client_secret.json', scopes=['https://www.googleapis.com/auth/youtube.force-ssl']) # Required, 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( # Recommended, 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', # Optional, enable incremental authorization. Recommended as a best practice. include_granted_scopes='true', # Optional, if your application knows which user is trying to authenticate, it can use this # parameter to provide a hint to the Google Authentication Server. login_hint='hint@example.com', # Optional, set prompt to 'consent' will prompt the user for consent prompt='consent')
Ruby
अपने ऐप्लिकेशन में क्लाइंट ऑब्जेक्ट को कॉन्फ़िगर करने के लिए, बनाई गई client_secrets.json फ़ाइल का इस्तेमाल करें. क्लाइंट ऑब्जेक्ट को कॉन्फ़िगर करते समय, आपको उन स्कोप के बारे में बताना होता है जिन्हें आपके ऐप्लिकेशन को ऐक्सेस करना है. साथ ही, आपको अपने ऐप्लिकेशन के ऑथराइज़ेशन एंडपॉइंट का यूआरएल भी देना होता है. यह यूआरएल, OAuth 2.0 सर्वर से मिले जवाब को हैंडल करेगा.
उदाहरण के लिए, यह कोड किसी उपयोगकर्ता के YouTube खाते को मैनेज करने के लिए, ऑफ़लाइन ऐक्सेस का अनुरोध करता है:
require 'googleauth' require 'googleauth/web_user_authorizer' require 'googleauth/stores/redis_token_store' require 'google/apis/youtube_v3' # Required, call the from_file method to retrieve the client ID from a # client_secret.json file. client_id = Google::Auth::ClientId.from_file('/path/to/client_secret.json') # Required, scope value scope = 'https://www.googleapis.com/auth/youtube.force-ssl' # Required, Authorizers require a storage instance to manage long term persistence of # access and refresh tokens. token_store = Google::Auth::Stores::RedisTokenStore.new(redis: Redis.new) # Required, 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. callback_uri = '/oauth2callback' # 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. authorizer = Google::Auth::WebUserAuthorizer.new(client_id, scope, token_store, callback_uri)
आपका ऐप्लिकेशन, क्लाइंट ऑब्जेक्ट का इस्तेमाल करके OAuth 2.0 की कार्रवाइयां करता है. जैसे, अनुमति के लिए अनुरोध करने वाले यूआरएल जनरेट करना और एचटीटीपी अनुरोधों पर ऐक्सेस टोकन लागू करना.
Node.js
यहां दिए गए कोड स्निपेट से एक google.auth.OAuth2
ऑब्जेक्ट बनता है. यह ऑब्जेक्ट, अनुमति के अनुरोध में पैरामीटर तय करता है.
यह ऑब्जेक्ट, आपकी client_secret.json फ़ाइल से मिली जानकारी का इस्तेमाल करके आपके ऐप्लिकेशन की पहचान करता है. किसी उपयोगकर्ता से ऐक्सेस टोकन पाने की अनुमतियां मांगने के लिए, उसे सहमति पेज पर रीडायरेक्ट करें. सहमति पेज का यूआरएल बनाने के लिए:
const {google} = require('googleapis'); const crypto = require('crypto'); const express = require('express'); const session = require('express-session'); /** * 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 YouTube API const scopes = [ 'https://www.googleapis.com/auth/youtube.force-ssl' ]; // Generate a secure random state value. const state = crypto.randomBytes(32).toString('hex'); // Store state in the session req.session.state = state; // Generate a url that asks permissions for the Drive activity and Google Calendar 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, // Include the state parameter to reduce the risk of CSRF attacks. state: state });
अहम जानकारी - refresh_token
सिर्फ़ पहली बार पुष्टि करने पर मिलता है. ज़्यादा जानकारी के लिए
यहां जाएं.
एचटीटीपी/रेस्ट
Google का OAuth 2.0 एंडपॉइंट https://accounts.google.com/o/oauth2/v2/auth
पर है. इस एंडपॉइंट को सिर्फ़ एचटीटीपीएस पर ऐक्सेस किया जा सकता है. सामान्य एचटीटीपी कनेक्शन अस्वीकार कर दिए जाते हैं.
Google का ऑथराइज़ेशन सर्वर, वेब सर्वर ऐप्लिकेशन के लिए इन क्वेरी स्ट्रिंग पैरामीटर का इस्तेमाल करता है:
पैरामीटर | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
client_id |
ज़रूरी है
आपके ऐप्लिकेशन का क्लाइंट आईडी. यह वैल्यू आपको में मिलेगी. |
||||||||||||||||
redirect_uri |
ज़रूरी है
यह कुकी तय करती है कि उपयोगकर्ता के अनुमति देने की प्रोसेस पूरी करने के बाद, एपीआई सर्वर उसे कहां रीडायरेक्ट करेगा. यह वैल्यू, OAuth 2.0 क्लाइंट के लिए अनुमति वाले रीडायरेक्ट यूआरआई में से किसी एक से पूरी तरह मेल खानी चाहिए. इसे आपने अपने क्लाइंट के
में कॉन्फ़िगर किया था. अगर यह वैल्यू, दिए गए ध्यान दें कि |
||||||||||||||||
response_type |
ज़रूरी है
इस कुकी से यह तय होता है कि Google OAuth 2.0 एंडपॉइंट, ऑथराइज़ेशन कोड दिखाता है या नहीं. वेब सर्वर ऐप्लिकेशन के लिए, पैरामीटर वैल्यू को |
||||||||||||||||
scope |
ज़रूरी है
यह स्पेस से अलग की गई स्कोप की सूची होती है. इससे उन संसाधनों की पहचान होती है जिन्हें आपका ऐप्लिकेशन, उपयोगकर्ता की ओर से ऐक्सेस कर सकता है. इन वैल्यू से, सहमति वाली उस स्क्रीन के बारे में पता चलता है जिसे Google, उपयोगकर्ता को दिखाता है. स्कोप की मदद से, आपका ऐप्लिकेशन सिर्फ़ उन संसाधनों को ऐक्सेस करने का अनुरोध कर सकता है जिनकी उसे ज़रूरत है. साथ ही, इससे उपयोगकर्ताओं को यह कंट्रोल करने की सुविधा मिलती है कि वे आपके ऐप्लिकेशन को कितना ऐक्सेस दें. इसलिए, अनुरोध किए गए स्कोप की संख्या और उपयोगकर्ता की सहमति मिलने की संभावना के बीच उल्टा संबंध होता है. YouTube Data API v3, इन स्कोप का इस्तेमाल करता है:
OAuth 2.0 API स्कोप दस्तावेज़ में, उन सभी स्कोप की पूरी सूची दी गई है जिनका इस्तेमाल करके, Google API को ऐक्सेस किया जा सकता है. हमारा सुझाव है कि आपका ऐप्लिकेशन, जब भी हो सके, कॉन्टेक्स्ट के हिसाब से अनुमति के स्कोप का ऐक्सेस पाने का अनुरोध करे. ज़्यादा अनुमति मांगने की सुविधा की मदद से, ज़रूरत के मुताबिक उपयोगकर्ता के डेटा को ऐक्सेस करने का अनुरोध करें. इससे, उपयोगकर्ताओं को यह समझने में आसानी होती है कि आपके ऐप्लिकेशन को उस डेटा को ऐक्सेस करने की ज़रूरत क्यों है. |
||||||||||||||||
access_type |
सुझाया गया
इससे पता चलता है कि जब उपयोगकर्ता ब्राउज़र पर मौजूद न हो, तब आपका ऐप्लिकेशन ऐक्सेस टोकन को रीफ़्रेश कर सकता है या नहीं. पैरामीटर की मान्य वैल्यू अगर आपके ऐप्लिकेशन को ऐक्सेस टोकन रीफ़्रेश करने की ज़रूरत है, तो वैल्यू को |
||||||||||||||||
state |
सुझाया गया
यह ऐसी स्ट्रिंग वैल्यू तय करता है जिसका इस्तेमाल आपका ऐप्लिकेशन, अनुमति देने के अनुरोध और अनुमति देने वाले सर्वर की प्रतिक्रिया के बीच की स्थिति को बनाए रखने के लिए करता है.
उपयोगकर्ता के ऐप्लिकेशन के ऐक्सेस के अनुरोध को स्वीकार करने या अस्वीकार करने के बाद, सर्वर उस वैल्यू को दिखाता है जिसे आपने इस पैरामीटर का इस्तेमाल कई कामों के लिए किया जा सकता है. जैसे, उपयोगकर्ता को आपके ऐप्लिकेशन में सही संसाधन पर भेजना, नॉनस भेजना, और किसी दूसरी साइट से किए गए फ़र्ज़ी अनुरोध को कम करना. आपके |
||||||||||||||||
include_granted_scopes |
ज़रूरी नहीं
इससे ऐप्लिकेशन, ज़रूरत के मुताबिक अनुमति मांगने की सुविधा का इस्तेमाल करके, कॉन्टेक्स्ट में मौजूद अन्य स्कोप को ऐक्सेस करने का अनुरोध कर पाते हैं. अगर आपने इस पैरामीटर की वैल्यू |
||||||||||||||||
enable_granular_consent |
ज़रूरी नहीं
डिफ़ॉल्ट रूप से, यह जब Google किसी ऐप्लिकेशन के लिए, ज़्यादा बारीकी से अनुमतियां सेट करने की सुविधा चालू करता है, तब इस पैरामीटर का कोई असर नहीं होगा. |
||||||||||||||||
login_hint |
ज़रूरी नहीं
अगर आपके ऐप्लिकेशन को पता है कि कौन सा उपयोगकर्ता पुष्टि करने की कोशिश कर रहा है, तो वह इस पैरामीटर का इस्तेमाल करके, Google Authentication Server को इसकी जानकारी दे सकता है. सर्वर इस हिंट का इस्तेमाल, लॉगिन फ़्लो को आसान बनाने के लिए करता है. इसके लिए, वह साइन-इन फ़ॉर्म में ईमेल फ़ील्ड को पहले से भर देता है या सही मल्टी-लॉगिन सेशन चुन लेता है. पैरामीटर की वैल्यू को किसी ईमेल पते या |
||||||||||||||||
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(request: request)
- उपयोगकर्ता को
auth_uri
पर रीडायरेक्ट करें.
Node.js
-
Google के OAuth 2.0 सर्वर से ऐक्सेस का अनुरोध करने के लिए, पहले चरण में जनरेट किए गए यूआरएल
authorizationUrl
का इस्तेमाल करें.generateAuthUrl
-
उपयोगकर्ता को
authorizationUrl
पर रीडायरेक्ट करें.res.redirect(authorizationUrl);
एचटीटीपी/रेस्ट
Google के अनुमति देने वाले सर्वर पर रीडायरेक्ट करने का उदाहरण
यहां दिए गए यूआरएल के सैंपल में, ऐसे स्कोप के लिए ऑफ़लाइन ऐक्सेस (access_type=offline
) का अनुरोध किया गया है जो उपयोगकर्ता के YouTube खाते को देखने का ऐक्सेस देता है. यह इंक्रीमेंटल ऑथराइज़ेशन का इस्तेमाल करता है, ताकि यह पक्का किया जा सके कि नए ऐक्सेस टोकन में वे सभी स्कोप शामिल हों जिनके लिए उपयोगकर्ता ने पहले ऐप्लिकेशन को ऐक्सेस करने की अनुमति दी थी. यूआरएल, ज़रूरी redirect_uri
, response_type
, और client_id
पैरामीटर के साथ-साथ state
पैरामीटर के लिए भी वैल्यू सेट करता है. यूआरएल में लाइन ब्रेक और स्पेस शामिल हैं, ताकि इसे आसानी से पढ़ा जा सके.
https://accounts.google.com/o/oauth2/v2/auth?
scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyoutube.readonly&
access_type=offline&
include_granted_scopes=true&
state=state_parameter_passthrough_value&
redirect_uri=http%3A%2F%2Flocalhost%2Foauth2callback&
response_type=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 लाइब्रेरी का इस्तेमाल करना चाहिए. जैसे, Google Sign-In for Android या OpenID Foundation का AppAuth for Android.
वेब डेवलपर को यह गड़बड़ी तब दिख सकती है, जब कोई Android ऐप्लिकेशन, एम्बेड किए गए उपयोगकर्ता-एजेंट में सामान्य वेब लिंक खोलता है और कोई उपयोगकर्ता आपकी साइट से Google के OAuth 2.0 ऑथराइज़ेशन एंडपॉइंट पर जाता है. डेवलपर को सामान्य लिंक को ऑपरेटिंग सिस्टम के डिफ़ॉल्ट लिंक हैंडलर में खोलने की अनुमति देनी चाहिए. इसमें Android ऐप्लिकेशन लिंक हैंडलर या डिफ़ॉल्ट ब्राउज़र ऐप्लिकेशन, दोनों शामिल हैं. Android कस्टम टैब लाइब्रेरी भी एक विकल्प है.
iOS
iOS और macOS के डेवलपर को यह गड़बड़ी तब दिख सकती है, जब वे WKWebView
में अनुमति पाने के अनुरोध खोलते हैं.
डेवलपर को इसके बजाय, iOS लाइब्रेरी का इस्तेमाल करना चाहिए. जैसे, Google Sign-In for iOS या OpenID Foundation की AppAuth for iOS.
वेब डेवलपर को यह गड़बड़ी तब दिख सकती है, जब कोई iOS या macOS ऐप्लिकेशन, एम्बेड किए गए उपयोगकर्ता-एजेंट में कोई सामान्य वेब लिंक खोलता है और कोई उपयोगकर्ता आपकी साइट से Google के OAuth 2.0 ऑथराइज़ेशन एंडपॉइंट पर जाता है. डेवलपर को सामान्य लिंक को ऑपरेटिंग सिस्टम के डिफ़ॉल्ट लिंक हैंडलर में खोलने की अनुमति देनी चाहिए. इसमें यूनिवर्सल लिंक हैंडलर या डिफ़ॉल्ट ब्राउज़र ऐप्लिकेशन, दोनों शामिल हैं. SFSafariViewController
लाइब्रेरी भी एक विकल्प है.
org_internal
अनुरोध में मौजूद OAuth क्लाइंट आईडी, ऐसे प्रोजेक्ट का हिस्सा है जो किसी खास Google Cloud संगठन में Google खातों के ऐक्सेस को सीमित करता है. इस कॉन्फ़िगरेशन विकल्प के बारे में ज़्यादा जानने के लिए, OAuth की सहमति वाली स्क्रीन सेट अप करने से जुड़े सहायता लेख में, उपयोगकर्ता का टाइप सेक्शन देखें.
invalid_client
OAuth क्लाइंट सीक्रेट गलत है. OAuth क्लाइंट कॉन्फ़िगरेशन की समीक्षा करें. इसमें इस अनुरोध के लिए इस्तेमाल किया गया क्लाइंट आईडी और सीक्रेट शामिल है.
deleted_client
अनुरोध करने के लिए इस्तेमाल किए जा रहे OAuth क्लाइंट को मिटा दिया गया है. क्लाइंट को मैन्युअल तरीके से मिटाया जा सकता है. इसके अलावा, इस्तेमाल नहीं किए जा रहे क्लाइंट के मामले में, क्लाइंट अपने-आप मिट जाते हैं. मिटाए गए क्लाइंट को मिटाने के 30 दिनों के अंदर वापस लाया जा सकता है. ज़्यादा जानें .
invalid_grant
ऐक्सेस टोकन को रीफ़्रेश करते समय या इंक्रीमेंटल ऑथराइज़ेशन का इस्तेमाल करते समय, टोकन की समयसीमा खत्म हो सकती है या उसे अमान्य कर दिया गया हो. उपयोगकर्ता की पुष्टि फिर से करें और नए टोकन पाने के लिए, उपयोगकर्ता से सहमति लें. अगर आपको यह गड़बड़ी अब भी दिख रही है, तो पक्का करें कि आपका ऐप्लिकेशन सही तरीके से कॉन्फ़िगर किया गया हो. साथ ही, यह भी पक्का करें कि आपने अपने अनुरोध में सही टोकन और पैरामीटर इस्तेमाल किए हों. ऐसा न होने पर, हो सकता है कि उपयोगकर्ता का खाता मिटा दिया गया हो या बंद कर दिया गया हो.
redirect_uri_mismatch
अनुमति के अनुरोध में पास किया गया redirect_uri
, OAuth क्लाइंट आईडी के लिए अनुमति वाले रीडायरेक्ट यूआरआई से मेल नहीं खाता.
में जाकर, अनुमति वाले रीडायरेक्ट यूआरआई देखें.
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 में मौजूद फ़ाइलों का मेटाडेटा देखने के लिए, सिर्फ़ पढ़ने का ऐक्सेस और आपके Google Calendar इवेंट देखने के लिए, सिर्फ़ पढ़ने का ऐक्सेस मांगता है:
https://accounts.google.com/o/oauth2/v2/auth? scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyoutube.readonly& access_type=offline& include_granted_scopes=true& state=state_parameter_passthrough_value& redirect_uri=http%3A%2F%2Flocalhost%2Foauth2callback& response_type=code& client_id=client_id
OAuth 2.0 फ़्लो पूरा करने के बाद, आपको http://localhost/oauth2callback
पर रीडायरेक्ट किया जाएगा. अगर आपकी लोकल मशीन उस पते पर कोई फ़ाइल नहीं देती है, तो आपको 404 NOT FOUND
गड़बड़ी दिखेगी. अगले चरण में, उस जानकारी के बारे में ज़्यादा बताया गया है जो उपयोगकर्ता को आपके ऐप्लिकेशन पर वापस रीडायरेक्ट किए जाने पर, यूआरआई में दिखती है.
पाँचवाँ चरण: ऑथराइज़ेशन कोड को रीफ़्रेश और ऐक्सेस टोकन के लिए बदलना
वेब सर्वर को ऑथराइज़ेशन कोड मिलने के बाद, वह ऑथराइज़ेशन कोड को ऐक्सेस टोकन से बदल सकता है.
PHP
ऑथराइज़ेशन कोड को ऐक्सेस टोकन से बदलने के लिए, fetchAccessTokenWithAuthCode
तरीके का इस्तेमाल करें:
$access_token = $client->fetchAccessTokenWithAuthCode($_GET['code']);
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/youtube.force-ssl'], 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, 'granted_scopes': credentials.granted_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. app.get('/oauth2callback', async (req, res) => { 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 if (q.state !== req.session.state) { //check state value console.log('State mismatch. Possible CSRF attack'); res.end('State mismatch. Possible CSRF attack'); } else { // Get access and refresh tokens (if access_type is offline) let { tokens } = await oauth2Client.getToken(q.code); oauth2Client.setCredentials(tokens); });
एचटीटीपी/रेस्ट
ऑथराइज़ेशन कोड को ऐक्सेस टोकन से बदलने के लिए, https://oauth2.googleapis.com/token
एंडपॉइंट को कॉल करें और ये पैरामीटर सेट करें:
फ़ील्ड | |
---|---|
client_id |
यह क्लाइंट आईडी, से मिला है. |
client_secret |
क्लाइंट सीक्रेट, से मिला है. |
code |
यह शुरुआती अनुरोध से मिला ऑथराइज़ेशन कोड है. |
grant_type |
OAuth 2.0 की खास बातों में बताए गए तरीके के मुताबिक, इस फ़ील्ड की वैल्यू authorization_code पर सेट होनी चाहिए. |
redirect_uri |
आपके प्रोजेक्ट के लिए, में दिए गए रीडायरेक्ट यूआरआई में से कोई एक
, दिए गए
client_id के लिए. |
यहां दिए गए स्निपेट में, अनुरोध का एक सैंपल दिखाया गया है:
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 पर सेट किया हो.
|
refresh_token_expires_in |
रीफ़्रेश टोकन की बची हुई लाइफ़टाइम, सेकंड में. यह वैल्यू सिर्फ़ तब सेट होती है, जब उपयोगकर्ता समयसीमा के हिसाब से ऐक्सेस देता है. |
scope |
access_token से मिले ऐक्सेस के स्कोप. इन्हें केस-सेंसिटिव स्ट्रिंग की सूची के तौर पर दिखाया जाता है. इनके बीच में खाली जगह का इस्तेमाल किया जाता है. |
token_type |
लौटाया गया टोकन किस तरह का है. इस समय, इस फ़ील्ड की वैल्यू हमेशा Bearer पर सेट होती है. |
यहां जवाब का एक सैंपल दिखाया गया है:
{ "access_token": "1/fFAGRNJru1FTz70BzhT3Zg", "expires_in": 3920, "token_type": "Bearer", "scope": "https://www.googleapis.com/auth/youtube.force-ssl", "refresh_token": "1//xEoDL4iW3cxlI7yDbSRFYNG01kVKM2C-259HOF2aQbI" }
गड़बड़ियां
ऑथराइज़ेशन कोड को ऐक्सेस टोकन के लिए एक्सचेंज करते समय, आपको उम्मीद के मुताबिक जवाब मिलने के बजाय यह गड़बड़ी दिख सकती है. यहां गड़बड़ी के सामान्य कोड और उन्हें ठीक करने के सुझाव दिए गए हैं.
invalid_grant
दिया गया ऑथराइज़ेशन कोड अमान्य है या गलत फ़ॉर्मैट में है. OAuth की प्रोसेस को फिर से शुरू करके नए कोड का अनुरोध करें, ताकि उपयोगकर्ता से फिर से सहमति मांगी जा सके.
छठा चरण: यह देखना कि उपयोगकर्ताओं ने किन स्कोप का ऐक्सेस दिया है
एक से ज़्यादा अनुमतियों (स्कोप) का अनुरोध करने पर, ऐसा हो सकता है कि उपयोगकर्ता आपके ऐप्लिकेशन को उन सभी का ऐक्सेस न दें. आपके ऐप्लिकेशन को यह पुष्टि करनी होगी कि कौनसे स्कोप असल में दिए गए थे. साथ ही, उसे उन स्थितियों को आसानी से मैनेज करना होगा जहां कुछ अनुमतियां अस्वीकार कर दी गई हैं. आम तौर पर, ऐसा उन सुविधाओं को बंद करके किया जाता है जो अस्वीकार किए गए स्कोप पर निर्भर करती हैं.
हालांकि, इसके कुछ अपवाद हैं. Google Workspace Enterprise के ऐसे ऐप्लिकेशन जिनमें पूरे डोमेन के लिए अधिकार सौंपने की सुविधा उपलब्ध है या जिन्हें भरोसेमंद के तौर पर मार्क किया गया है वे अनुमतियों के लिए सहमति लेने वाली स्क्रीन को बायपास कर देते हैं. इन ऐप्लिकेशन के लिए, लोगों को अनुमति देने के लिए ज़्यादा जानकारी वाली स्क्रीन नहीं दिखेगी. इसके बजाय, आपके ऐप्लिकेशन को या तो अनुरोध किए गए सभी स्कोप मिलेंगे या कोई भी नहीं मिलेगा.
ज़्यादा जानकारी के लिए, अनुमति देने के अलग-अलग विकल्पों को मैनेज करने का तरीका लेख पढ़ें.
PHP
उपयोगकर्ता ने किन स्कोप का ऐक्सेस दिया है, यह देखने के लिए getGrantedScope()
तरीके का इस्तेमाल करें:
// Space-separated string of granted scopes if it exists, otherwise null. $granted_scopes = $client->getOAuth2Service()->getGrantedScope();
Python
दिखाए गए credentials
ऑब्जेक्ट में granted_scopes
प्रॉपर्टी होती है. यह उन स्कोप की सूची होती है जिन्हें उपयोगकर्ता ने आपके ऐप्लिकेशन को ऐक्सेस करने की अनुमति दी है.
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, 'granted_scopes': credentials.granted_scopes}
Ruby
एक साथ कई स्कोप का अनुरोध करते समय, देखें कि credentials
ऑब्जेक्ट की scope
प्रॉपर्टी के ज़रिए कौनसे स्कोप दिए गए थे.
# User authorized the request. Now, check which scopes were granted. if credentials.scope.include?(Google::Apis::YoutubeV3::AUTH_YOUTUBE_FORCE_SSL) # User authorized permission to see, edit, and permanently delete the # YouTube videos, ratings, comments and captions. # Calling the APIs, etc else # User didn't authorize the permission. # Update UX and application accordingly end
Node.js
एक साथ कई स्कोप का अनुरोध करते समय, देखें कि tokens
ऑब्जेक्ट की scope
प्रॉपर्टी के ज़रिए कौनसे स्कोप दिए गए थे.
// User authorized the request. Now, check which scopes were granted. if (tokens.scope.includes('https://www.googleapis.com/auth/youtube.force-ssl')) { // User authorized permission to see, edit, and permanently delete the // YouTube videos, ratings, comments and captions. // Calling the APIs, etc. } else { // User didn't authorize read-only Drive activity permission. // Update UX and application accordingly }
एचटीटीपी/रेस्ट
यह देखने के लिए कि उपयोगकर्ता ने आपके ऐप्लिकेशन को किसी स्कोप का ऐक्सेस दिया है या नहीं, ऐक्सेस टोकन के जवाब में मौजूद scope
फ़ील्ड की जांच करें. ऐक्सेस टोकन से मिले ऐक्सेस के स्कोप. इन्हें स्पेस से अलग की गई, केस-सेंसिटिव स्ट्रिंग की सूची के तौर पर दिखाया जाता है.
उदाहरण के लिए, यहां दिए गए ऐक्सेस टोकन के जवाब से पता चलता है कि उपयोगकर्ता ने आपके ऐप्लिकेशन को, YouTube वीडियो, रेटिंग, टिप्पणियां, और कैप्शन देखने, उनमें बदलाव करने, और उन्हें हमेशा के लिए मिटाने की अनुमति दी है:
{ "access_token": "1/fFAGRNJru1FTz70BzhT3Zg", "expires_in": 3920, "token_type": "Bearer", "scope": "https://www.googleapis.com/auth/youtube.force-ssl", "refresh_token": "1//xEoDL4iW3cxlI7yDbSRFYNG01kVKM2C-259HOF2aQbI" }
Google API को कॉल करना
PHP
Google API को कॉल करने के लिए, ऐक्सेस टोकन का इस्तेमाल करें. इसके लिए, यह तरीका अपनाएं:
- अगर आपको किसी नए
Google\Client
ऑब्जेक्ट पर ऐक्सेस टोकन लागू करना है, तोsetAccessToken
तरीके का इस्तेमाल करें. उदाहरण के लिए, अगर आपने ऐक्सेस टोकन को उपयोगकर्ता सेशन में सेव किया है, तो इस तरीके का इस्तेमाल करें:$client->setAccessToken($access_token);
- उस एपीआई के लिए एक सेवा ऑब्जेक्ट बनाएं जिसे आपको कॉल करना है. आपको सेवा ऑब्जेक्ट बनाने के लिए, उस एपीआई के कंस्ट्रक्टर को अनुमति वाला
Google\Client
ऑब्जेक्ट देना होगा जिसे आपको कॉल करना है. उदाहरण के लिए, YouTube Data API को कॉल करने के लिए:$youtube = new Google_Service_YouTube($client);
-
सेवा ऑब्जेक्ट की ओर से उपलब्ध कराए गए इंटरफ़ेस का इस्तेमाल करके, एपीआई सेवा से अनुरोध करें.
उदाहरण के लिए, अनुमति वाले उपयोगकर्ता के YouTube चैनल का डेटा वापस पाने के लिए:
$channel = $youtube->channels->listChannels('snippet', array('mine' => $mine));
Python
ऐक्सेस टोकन मिलने के बाद, आपका ऐप्लिकेशन उस टोकन का इस्तेमाल करके, किसी उपयोगकर्ता खाते या सेवा खाते की ओर से एपीआई अनुरोधों को अनुमति दे सकता है. जिस एपीआई को कॉल करना है उसके लिए, उपयोगकर्ता के हिसाब से अनुमति देने वाले क्रेडेंशियल का इस्तेमाल करके एक सेवा ऑब्जेक्ट बनाएं. इसके बाद, उस ऑब्जेक्ट का इस्तेमाल करके अनुमति वाले एपीआई अनुरोध करें.
- उस एपीआई के लिए एक सेवा ऑब्जेक्ट बनाएं जिसे आपको कॉल करना है. एपीआई के नाम, वर्शन, और उपयोगकर्ता के क्रेडेंशियल के साथ
googleapiclient.discovery
लाइब्रेरी केbuild
तरीके को कॉल करके, सेवा ऑब्जेक्ट बनाया जाता है: उदाहरण के लिए, YouTube Data API के वर्शन 3 को कॉल करने के लिए:from googleapiclient.discovery import build youtube = build('youtube', 'v3', credentials=credentials)
- सेवा ऑब्जेक्ट की ओर से उपलब्ध कराए गए इंटरफ़ेस का इस्तेमाल करके, एपीआई सेवा से अनुरोध करें.
उदाहरण के लिए, अनुमति वाले उपयोगकर्ता के YouTube चैनल का डेटा वापस पाने के लिए:
channel = youtube.channels().list(mine=True, part='snippet').execute()
Ruby
ऐक्सेस टोकन मिलने के बाद, आपका ऐप्लिकेशन उस टोकन का इस्तेमाल करके, किसी उपयोगकर्ता खाते या सेवा खाते की ओर से एपीआई अनुरोध कर सकता है. जिस एपीआई को कॉल करना है उसके लिए, उपयोगकर्ता के हिसाब से अनुमति देने वाले क्रेडेंशियल का इस्तेमाल करके एक सेवा ऑब्जेक्ट बनाएं. इसके बाद, उस ऑब्जेक्ट का इस्तेमाल करके अनुमति वाले एपीआई अनुरोध करें.
- उस एपीआई के लिए एक सेवा ऑब्जेक्ट बनाएं जिसे आपको कॉल करना है.
उदाहरण के लिए, YouTube Data API के वर्शन 3 को कॉल करने के लिए:
youtube = Google::Apis::YoutubeV3::YouTubeService.new
- सेवा पर क्रेडेंशियल सेट करें:
youtube.authorization = credentials
- सेवा ऑब्जेक्ट की ओर से उपलब्ध कराए गए इंटरफ़ेस का इस्तेमाल करके, एपीआई सेवा से अनुरोध करें.
उदाहरण के लिए, अनुमति वाले उपयोगकर्ता के YouTube चैनल का डेटा वापस पाने के लिए:
channel = youtube.list_channels(part, :mine => mine)
इसके अलावा, हर तरीके के हिसाब से अनुमति दी जा सकती है. इसके लिए, किसी तरीके को options
पैरामीटर दें:
channel = youtube.list_channels(part, :mine => mine, options: { authorization: auth_client })
Node.js
ऐक्सेस टोकन पाने और उसे OAuth2
ऑब्जेक्ट पर सेट करने के बाद, Google API को कॉल करने के लिए ऑब्जेक्ट का इस्तेमाल करें. आपका ऐप्लिकेशन, उस टोकन का इस्तेमाल करके किसी उपयोगकर्ता खाते या सेवा खाते की ओर से एपीआई अनुरोधों को अनुमति दे सकता है. उस एपीआई के लिए एक सेवा ऑब्जेक्ट बनाएं जिसे आपको कॉल करना है.
उदाहरण के लिए, यहां दिया गया कोड, Google Drive API का इस्तेमाल करके उपयोगकर्ता की Drive में मौजूद फ़ाइलों के नाम दिखाता है.
const { google } = require('googleapis'); // Example of using YouTube API to list channels. var service = google.youtube('v3'); service.channels.list({ auth: oauth2Client, part: 'snippet,contentDetails,statistics', forUsername: 'GoogleDevelopers' }, function (err, response) { if (err) { console.log('The API returned an error: ' + err); return; } var channels = response.data.items; if (channels.length == 0) { console.log('No channel found.'); } else { console.log('This channel\'s ID is %s. Its title is \'%s\', and ' + 'it has %s views.', channels[0].id, channels[0].snippet.title, channels[0].statistics.viewCount); } });
एचटीटीपी/रेस्ट
जब आपका ऐप्लिकेशन ऐक्सेस टोकन हासिल कर लेता है, तब आपके पास इस टोकन का इस्तेमाल करके, किसी Google API को कॉल करने का विकल्प होता है. हालांकि, ऐसा सिर्फ़ तब किया जा सकता है, जब एपीआई के लिए ज़रूरी स्कोप का ऐक्सेस दिया गया हो. इसके लिए, एपीआई को भेजे जाने वाले अनुरोध में ऐक्सेस टोकन शामिल करें. इसके लिए, access_token
क्वेरी पैरामीटर या Authorization
एचटीटीपी हेडर Bearer
वैल्यू में से किसी एक को शामिल करें. जब भी हो सके, एचटीटीपी हेडर का इस्तेमाल करें. ऐसा इसलिए, क्योंकि क्वेरी स्ट्रिंग, सर्वर लॉग में दिखती हैं. ज़्यादातर मामलों में, Google API को कॉल करने के लिए क्लाइंट लाइब्रेरी का इस्तेमाल किया जा सकता है. उदाहरण के लिए, YouTube Data API को कॉल करते समय.
ध्यान दें कि YouTube Data API, सेवा खातों का इस्तेमाल सिर्फ़ उन YouTube कॉन्टेंट के मालिकों के लिए करता है जिनके पास एक से ज़्यादा YouTube चैनल हैं और वे उन्हें मैनेज करते हैं. जैसे, रिकॉर्ड लेबल और फ़िल्म स्टूडियो.
OAuth 2.0 Playground पर जाकर, Google के सभी एपीआई आज़माए जा सकते हैं. साथ ही, उनके स्कोप देखे जा सकते हैं.
एचटीटीपी GET के उदाहरण
Authorization: Bearer
एचटीटीपी हेडर का इस्तेमाल करके,
youtube.channels
एंडपॉइंट (YouTube Data API) को किया गया कॉल इस तरह दिख सकता है. ध्यान दें कि आपको अपना ऐक्सेस टोकन डालना होगा:
GET /youtube/v3/channels?part=snippet&mine=true HTTP/1.1 Host: www.googleapis.com Authorization: Bearer access_token
यहां पुष्टि किए गए उपयोगकर्ता के लिए, access_token
क्वेरी स्ट्रिंग पैरामीटर का इस्तेमाल करके, उसी एपीआई को कॉल किया गया है:
GET https://www.googleapis.com/youtube/v3/channels?access_token=access_token&part=snippet&mine=true
curl
के उदाहरण
curl
कमांड-लाइन ऐप्लिकेशन की मदद से, इन कमांड की जांच की जा सकती है. यहां एचटीटीपी हेडर विकल्प (पसंदीदा) का इस्तेमाल करने वाला एक उदाहरण दिया गया है:
curl -H "Authorization: Bearer access_token" https://www.googleapis.com/youtube/v3/channels?part=snippet&mine=true
इसके अलावा, क्वेरी स्ट्रिंग पैरामीटर का विकल्प भी इस्तेमाल किया जा सकता है:
curl https://www.googleapis.com/youtube/v3/channels?access_token=access_token&part=snippet&mine=true
पूरा उदाहरण
यहां दिए गए उदाहरण में, JSON फ़ॉर्मैट में एक ऑब्जेक्ट प्रिंट किया गया है. इसमें उपयोगकर्ता के YouTube चैनल के बारे में जानकारी दी गई है. यह जानकारी तब दिखती है, जब उपयोगकर्ता पुष्टि कर लेता है और ऐप्लिकेशन को अपने YouTube खाते को मैनेज करने की अनुमति दे देता है.
PHP
इस उदाहरण को चलाने के लिए:
- API Consoleमें, लोकल मशीन का यूआरएल, रीडायरेक्ट किए गए यूआरएल की
सूची में जोड़ें. उदाहरण के लिए,
http://localhost:8080
जोड़ें. - नई डायरेक्ट्री बनाएं और उसमें जाएं. उदाहरण के लिए:
mkdir ~/php-oauth2-example cd ~/php-oauth2-example
- Composer का इस्तेमाल करके, PHP के लिए Google API Client Library इंस्टॉल करें:
composer require google/apiclient:^2.15.0
- यहां दिए गए कॉन्टेंट के साथ
index.php
औरoauth2callback.php
फ़ाइलें बनाएं. - 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_secret.json'); // User granted permission as an access token is in the session. if (isset($_SESSION['access_token']) && $_SESSION['access_token']) { $client->setAccessToken($_SESSION['access_token']); $youtube = new Google_Service_YouTube($client); $channel = $youtube->channels->listChannels('snippet', array('mine' => $mine)); echo json_encode($channel); } else { // Redirect users to outh2call.php which redirects users to Google OAuth 2.0 $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(); // Required, call the setAuthConfig function to load authorization credentials from // client_secret.json file. $client->setAuthConfigFile('client_secret.json'); $client->setRedirectUri('http://' . $_SERVER['HTTP_HOST']. $_SERVER['PHP_SELF']); // Required, to set the scope value, call the addScope function. $client->addScope(GOOGLE_SERVICE_YOUTUBE::YOUTUBE_FORCE_SSL); // Enable incremental authorization. Recommended as a best practice. $client->setIncludeGrantedScopes(true); // Recommended, 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"); // Generate a URL for authorization as it doesn't contain code and error if (!isset($_GET['code']) && !isset($_GET['error'])) { // Generate and set state value $state = bin2hex(random_bytes(16)); $client->setState($state); $_SESSION['state'] = $state; // Generate a url that asks permissions. $auth_url = $client->createAuthUrl(); header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL)); } // User authorized the request and authorization code is returned to exchange access and // refresh tokens. if (isset($_GET['code'])) { // Check the state value if (!isset($_GET['state']) || $_GET['state'] !== $_SESSION['state']) { die('State mismatch. Possible CSRF attack.'); } // Get access and refresh tokens (if access_type is offline) $token = $client->fetchAccessTokenWithAuthCode($_GET['code']); /** Save access and refresh token to the session variables. * ACTION ITEM: In a production app, you likely want to save the * refresh token in a secure persistent storage instead. */ $_SESSION['access_token'] = $token; $_SESSION['refresh_token'] = $client->getRefreshToken(); $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/'; header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL)); } // An error response e.g. error=access_denied if (isset($_GET['error'])) { echo "Error: ". $_GET['error']; } ?>
Python
इस उदाहरण में, Flask फ़्रेमवर्क का इस्तेमाल किया गया है. यह http://localhost:8080
पर एक वेब ऐप्लिकेशन चलाता है. इससे आपको OAuth 2.0 फ़्लो को टेस्ट करने में मदद मिलती है. उस यूआरएल पर जाने पर, आपको पांच लिंक दिखेंगे:
- एपीआई अनुरोध की जांच करना: यह लिंक, ऐसे पेज पर ले जाता है जो एपीआई के किसी अनुरोध को पूरा करने की कोशिश करता है. अगर ज़रूरी हो, तो यह अनुमति देने की प्रोसेस शुरू करता है. अगर अनुरोध पूरा हो जाता है, तो पेज पर एपीआई का जवाब दिखता है.
- पुष्टि करने की प्रोसेस को सीधे तौर पर टेस्ट करें: यह लिंक, उपयोगकर्ता को ऐसे पेज पर ले जाता है जो उसे पुष्टि करने की प्रोसेस से गुज़ारने की कोशिश करता है. यह ऐप्लिकेशन, उपयोगकर्ता की ओर से अनुमति वाले एपीआई अनुरोध सबमिट करने की अनुमति मांगता है.
- मौजूदा क्रेडेंशियल रद्द करें: यह लिंक, ऐसे पेज पर ले जाता है जो उपयोगकर्ता की ओर से ऐप्लिकेशन को पहले से दी गई अनुमतियों को रद्द करता है.
- Flask सेशन के क्रेडेंशियल मिटाएं: यह लिंक, अनुमति देने के लिए इस्तेमाल किए जाने वाले उन क्रेडेंशियल को मिटाता है जो Flask सेशन में सेव किए जाते हैं. इससे आपको यह देखने में मदद मिलती है कि अगर कोई ऐसा उपयोगकर्ता जिसने पहले ही आपके ऐप्लिकेशन को अनुमति दे दी है, नए सेशन में एपीआई अनुरोध को पूरा करने की कोशिश करता है, तो क्या होगा. इससे यह भी पता चलता है कि अगर कोई उपयोगकर्ता आपके ऐप्लिकेशन को दी गई अनुमतियां रद्द कर देता है और आपका ऐप्लिकेशन अब भी रद्द किए गए ऐक्सेस टोकन के साथ किसी अनुरोध को अनुमति देने की कोशिश करता है, तो आपको एपीआई से क्या जवाब मिलेगा.
# -*- 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" # The OAuth 2.0 access scope allows for access to the # authenticated user's account and requires requests to use an SSL connection. SCOPES = ['https://www.googleapis.com/auth/youtube.force-ssl'] API_SERVICE_NAME = 'youtube' API_VERSION = 'v3' 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']) youtube = googleapiclient.discovery.build( API_SERVICE_NAME, API_VERSION, credentials=credentials) channel = youtube.channels().list(mine=True, part='snippet').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(**channel) @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, 'granted_scopes': credentials.granted_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' # This disables the requested scopes and granted scopes check. # If users only grant partial request, the warning would not be thrown. os.environ['OAUTHLIB_RELAX_TOKEN_SCOPE'] = '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 'googleauth' require 'googleauth/web_user_authorizer' require 'googleauth/stores/redis_token_store' require 'google/apis/youtube_v3' require 'sinatra' configure do enable :sessions # Required, call the from_file method to retrieve the client ID from a # client_secret.json file. set :client_id, Google::Auth::ClientId.from_file('/path/to/client_secret.json') # Required, scope value # Access scopes for retrieving data about the user's YouTube channel. scope = 'Google::Apis::YoutubeV3::AUTH_YOUTUBE_FORCE_SSL' # Required, Authorizers require a storage instance to manage long term persistence of # access and refresh tokens. set :token_store, Google::Auth::Stores::RedisTokenStore.new(redis: Redis.new) # Required, 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. set :callback_uri, '/oauth2callback' # 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. set :authorizer, Google::Auth::WebUserAuthorizer.new(settings.client_id, settings.scope, settings.token_store, callback_uri: settings.callback_uri) end get '/' do # NOTE: Assumes the user is already authenticated to the app user_id = request.session['user_id'] # Fetch stored credentials for the user from the given request session. # nil if none present credentials = settings.authorizer.get_credentials(user_id, request) if credentials.nil? # Generate a url that asks the user to authorize requested scope(s). # Then, redirect user to the url. redirect settings.authorizer.get_authorization_url(request: request) end # User authorized read-only YouTube Data API permission. # Example of using YouTube Data API to list user's YouTube channel youtube = Google::Apis::YoutubeV3::YouTubeService.new channel = youtube.list_channels(part, :mine => mine, options: { authorization: auth_client }) "<pre>#{JSON.pretty_generate(channel.to_h)}</pre>" end # Receive the callback from Google's OAuth 2.0 server. get '/oauth2callback' do # Handle the result of the oauth callback. Defers the exchange of the code by # temporarily stashing the results in the user's session. 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
-
npm का इस्तेमाल करके, Node.js के लिए Google API Client Library इंस्टॉल करें:
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'); const crypto = require('crypto'); const express = require('express'); const session = require('express-session'); /** * 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 YouTube API const scopes = [ 'https://www.googleapis.com/auth/youtube.force-ssl' ]; /* 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 app = express(); app.use(session({ secret: 'your_secure_secret_key', // Replace with a strong secret resave: false, saveUninitialized: false, })); // Example on redirecting user to Google's OAuth 2.0 server. app.get('/', async (req, res) => { // Generate a secure random state value. const state = crypto.randomBytes(32).toString('hex'); // Store state in the session req.session.state = state; // Generate a url that asks permissions for the Drive activity and Google Calendar 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, // Include the state parameter to reduce the risk of CSRF attacks. state: state }); res.redirect(authorizationUrl); }); // Receive the callback from Google's OAuth 2.0 server. app.get('/oauth2callback', async (req, res) => { // 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 if (q.state !== req.session.state) { //check state value console.log('State mismatch. Possible CSRF attack'); res.end('State mismatch. Possible CSRF attack'); } 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 YouTube API to list channels. var service = google.youtube('v3'); service.channels.list({ auth: oauth2Client, part: 'snippet,contentDetails,statistics', forUsername: 'GoogleDevelopers' }, function (err, response) { if (err) { console.log('The API returned an error: ' + err); return; } var channels = response.data.items; if (channels.length == 0) { console.log('No channel found.'); } else { console.log('This channel\'s ID is %s. Its title is \'%s\', and ' + 'it has %s views.', channels[0].id, channels[0].snippet.title, channels[0].statistics.viewCount); } }); } }); // Example on revoking a token app.get('/revoke', async (req, res) => { // 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(); }); const server = http.createServer(app); server.listen(8080); } main().catch(console.error);
एचटीटीपी/रेस्ट
Python के इस उदाहरण में, OAuth 2.0 के वेब फ़्लो को दिखाने के लिए, Flask फ़्रेमवर्क और Requests लाइब्रेरी का इस्तेमाल किया गया है. हमारा सुझाव है कि इस फ़्लो के लिए, Python के लिए Google API क्लाइंट लाइब्रेरी का इस्तेमाल करें. (Python टैब में दिए गए उदाहरण में, क्लाइंट लाइब्रेरी का इस्तेमाल किया गया है.)
import json import flask import requests app = flask.Flask(__name__) # To get these credentials (CLIENT_ID CLIENT_SECRET) and for your application, visit # https://console.cloud.google.com/apis/credentials. CLIENT_ID = '123456789.apps.googleusercontent.com' CLIENT_SECRET = 'abc123' # Read from a file or environmental variable in a real app # Access scopes for YouTube API SCOPE = 'https://www.googleapis.com/auth/youtube.force-ssl' # 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. 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/youtube/v3/channels/list' r = requests.get(req_uri, headers=headers) return r.text @app.route('/oauth2callback') def oauth2callback(): if 'code' not in flask.request.args: state = str(uuid.uuid4()) flask.session['state'] = state # Generate a url that asks permissions for the Drive activity # and Google Calendar scope. Then, redirect user to the url. auth_uri = ('https://accounts.google.com/o/oauth2/v2/auth?response_type=code' '&client_id={}&redirect_uri={}&scope={}&state={}').format(CLIENT_ID, REDIRECT_URI, SCOPE, state) return flask.redirect(auth_uri) else: if 'state' not in flask.request.args or flask.request.args['state'] != flask.session['state']: return 'State mismatch. Possible CSRF attack.', 400 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'} # Exchange authorization code for access and refresh tokens (if access_type is offline) 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 |
रीडायरेक्ट यूआरआई में userinfo सब-कंपोनेंट शामिल नहीं हो सकता. |
पाथ |
रीडायरेक्ट यूआरआई में पाथ ट्रेवर्सल (इसे डायरेक्ट्री बैकट्रैकिंग भी कहा जाता है) नहीं होना चाहिए. इसे |
क्वेरी |
रीडायरेक्ट यूआरआई में ओपन रीडायरेक्ट शामिल नहीं होने चाहिए. |
फ़्रैगमेंट |
रीडायरेक्ट यूआरआई में फ़्रैगमेंट कॉम्पोनेंट नहीं हो सकता. |
वर्ण |
रीडायरेक्ट यूआरआई में कुछ वर्ण शामिल नहीं किए जा सकते. जैसे:
|
इंक्रीमेंटल ऑथराइज़ेशन
OAuth 2.0 प्रोटोकॉल में, आपका ऐप्लिकेशन संसाधनों को ऐक्सेस करने की अनुमति मांगता है. इन संसाधनों की पहचान स्कोप से होती है. जब आपको किसी संसाधन के लिए अनुमति की ज़रूरत हो, तब अनुमति का अनुरोध करना, उपयोगकर्ता अनुभव को बेहतर बनाने का सबसे सही तरीका माना जाता है. इस सुविधा को चालू करने के लिए, Google का अनुमति देने वाला सर्वर, इंक्रीमेंटल ऑथराइज़ेशन की सुविधा देता है. इस सुविधा की मदद से, ज़रूरत के हिसाब से स्कोप का अनुरोध किया जा सकता है. साथ ही, अगर उपयोगकर्ता नए स्कोप के लिए अनुमति देता है, तो यह सुविधा एक ऑथराइज़ेशन कोड दिखाती है. इस कोड को ऐसे टोकन के लिए बदला जा सकता है जिसमें वे सभी स्कोप शामिल होते हैं जिनके लिए उपयोगकर्ता ने प्रोजेक्ट को अनुमति दी है.
उदाहरण के लिए, मान लें कि कोई ऐप्लिकेशन लोगों को उनके इलाके में होने वाले दिलचस्प इवेंट के बारे में जानकारी देता है. इस ऐप्लिकेशन की मदद से, उपयोगकर्ता इवेंट के वीडियो देख सकते हैं, उन्हें रेटिंग दे सकते हैं, और वीडियो को प्लेलिस्ट में जोड़ सकते हैं. उपयोगकर्ता इस ऐप्लिकेशन का इस्तेमाल करके, अपने Google Calendar में इवेंट भी जोड़ सकते हैं.
इस मामले में, साइन-इन करते समय ऐप्लिकेशन को किसी भी स्कोप के ऐक्सेस की ज़रूरत नहीं पड़ सकती या वह इसके लिए अनुरोध नहीं कर सकता. हालांकि, अगर उपयोगकर्ता ने किसी वीडियो को रेटिंग देने, किसी वीडियो को प्लेलिस्ट में जोड़ने या YouTube पर कोई अन्य कार्रवाई करने की कोशिश की, तो ऐप्लिकेशन https://www.googleapis.com/auth/youtube.force-ssl
स्कोप के लिए ऐक्सेस का अनुरोध कर सकता है.
इसी तरह, अगर उपयोगकर्ता ने कैलेंडर इवेंट जोड़ने की कोशिश की, तो ऐप्लिकेशन https://www.googleapis.com/auth/calendar
स्कोप का ऐक्सेस मांग सकता है.
इंक्रीमेंटल ऑथराइज़ेशन लागू करने के लिए, ऐक्सेस टोकन का अनुरोध करने का सामान्य फ़्लो पूरा करें. हालांकि, यह पक्का करें कि ऑथराइज़ेशन के अनुरोध में, पहले से दी गई अनुमतियां शामिल हों. इस तरीके से, आपके ऐप्लिकेशन को कई ऐक्सेस टोकन मैनेज करने की ज़रूरत नहीं पड़ती.
इंक्रीमेंटल ऑथराइज़ेशन से मिले ऐक्सेस टोकन पर ये नियम लागू होते हैं:
- इस टोकन का इस्तेमाल, उन संसाधनों को ऐक्सेस करने के लिए किया जा सकता है जो नए और एक साथ इस्तेमाल किए जाने वाले अनुमति के दायरे में आते हैं.
- जब आपको ऐक्सेस टोकन पाने के लिए, एक साथ अनुमति देने वाले रिफ़्रेश टोकन का इस्तेमाल करना होता है, तब ऐक्सेस टोकन, एक साथ अनुमति देने की सुविधा को दिखाता है. साथ ही, इसका इस्तेमाल रिस्पॉन्स में शामिल किसी भी
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 });
एचटीटीपी/रेस्ट
इस उदाहरण में, कॉल करने वाला ऐप्लिकेशन, उपयोगकर्ता के YouTube Analytics डेटा को वापस पाने के लिए ऐक्सेस का अनुरोध करता है. इसके अलावा, उपयोगकर्ता ने ऐप्लिकेशन को पहले से ही जो ऐक्सेस दिया है उसके लिए भी अनुरोध करता है.
GET https://accounts.google.com/o/oauth2/v2/auth? scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyt-analytics.readonly& access_type=offline& state=security_token%3D138rk%3Btarget_url%3Dhttp...index& redirect_uri=http%3A%2F%2Flocalhost%2Foauth2callback& response_type=code& client_id=client_id& include_granted_scopes=true
Refreshing an access token (offline access)
Access tokens periodically expire and become invalid credentials for a related API request. You can refresh an access token without prompting the user for permission (including when the user is not present) if you requested offline access to the scopes associated with the token.
- If you use a Google API Client Library, the client object refreshes the access token as needed as long as you configure that object for offline access.
- If you are not using a client library, you need to set the
access_type
HTTP query parameter tooffline
when redirecting the user to Google's OAuth 2.0 server. In that case, Google's authorization server returns a refresh token when you exchange an authorization code for an access token. Then, if the access token expires (or at any other time), you can use a refresh token to obtain a new access token.
Requesting offline access is a requirement for any application that needs to access a Google
API when the user is not present. For example, an app that performs backup services or
executes actions at predetermined times needs to be able to refresh its access token when the
user is not present. The default style of access is called online
.
Server-side web applications, installed applications, and devices all obtain refresh tokens during the authorization process. Refresh tokens are not typically used in client-side (JavaScript) web applications.
PHP
If your application needs offline access to a Google API, set the API client's access type to
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` });
क्लाइंट के पास रीफ़्रेश टोकन होने पर, ऐक्सेस टोकन अपने-आप मिल जाएंगे और एपीआई को अगली बार कॉल करने पर रीफ़्रेश हो जाएंगे.
एचटीटीपी/रेस्ट
ऐक्सेस टोकन को रीफ़्रेश करने के लिए, आपका ऐप्लिकेशन 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
स्टेटस कोड दिखाया जाता है.
एचटीटीपी/रेस्ट
प्रोग्राम के हिसाब से टोकन रद्द करने के लिए, आपका ऐप्लिकेशन 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
भी दिखाया जाता है.
समय के हिसाब से ऐक्सेस
समय के हिसाब से ऐक्सेस देने की सुविधा की मदद से, कोई उपयोगकर्ता आपके ऐप्लिकेशन को सीमित समय के लिए अपने डेटा का ऐक्सेस दे सकता है. इससे ऐप्लिकेशन को कोई कार्रवाई पूरी करने में मदद मिलती है. सहमति लेने के फ़्लो के दौरान, समय के हिसाब से ऐक्सेस देने की सुविधा, Google के चुनिंदा प्रॉडक्ट में उपलब्ध है. इससे लोगों को सीमित समय के लिए ऐक्सेस देने का विकल्प मिलता है. इसका एक उदाहरण Data Portability API है. यह डेटा को एक बार ट्रांसफ़र करने की सुविधा देता है.
जब कोई उपयोगकर्ता आपके ऐप्लिकेशन को तय समय के लिए ऐक्सेस करने की अनुमति देता है, तो तय समय के बाद रीफ़्रेश टोकन की समयसीमा खत्म हो जाएगी. ध्यान दें कि कुछ खास मामलों में, रीफ़्रेश टोकन की समयसीमा पहले ही खत्म हो सकती है. ज़्यादा जानकारी के लिए, ये मामले देखें. ऑथराइज़ेशन कोड एक्सचेंज रिस्पॉन्स में दिखाया गया refresh_token_expires_in
फ़ील्ड, ऐसे मामलों में रीफ़्रेश टोकन की समयसीमा खत्म होने तक का बचा हुआ समय दिखाता है.
'सभी खातों की सुरक्षा' सुविधा लागू करना
अपने उपयोगकर्ताओं के खातों को सुरक्षित रखने के लिए, आपको एक और कदम उठाना चाहिए. इसके लिए, Google की Cross-Account Protection Service का इस्तेमाल करके, Cross-Account Protection लागू करें. इस सेवा की मदद से, सुरक्षा से जुड़ी घटनाओं की सूचनाएं पाने के लिए सदस्यता ली जा सकती है. इससे आपके ऐप्लिकेशन को, उपयोगकर्ता के खाते में हुए बड़े बदलावों के बारे में जानकारी मिलती है. इसके बाद, इस जानकारी का इस्तेमाल करके कार्रवाई की जा सकती है. यह इस बात पर निर्भर करता है कि आपको इवेंट का जवाब कैसे देना है.
Google की Cross-Account Protection Service, आपके ऐप्लिकेशन को इस तरह के इवेंट भेजती है:
-
https://schemas.openid.net/secevent/risc/event-type/sessions-revoked
-
https://schemas.openid.net/secevent/oauth/event-type/token-revoked
-
https://schemas.openid.net/secevent/risc/event-type/account-disabled
सभी खातों की सुरक्षा की सुविधा लागू करने के तरीके और उपलब्ध इवेंट की पूरी सूची के बारे में ज़्यादा जानने के लिए, सभी खातों की सुरक्षा की सुविधा की मदद से उपयोगकर्ता खातों को सुरक्षित रखें पेज देखें.