वेब सर्वर ऐप्लिकेशन के लिए OAuth 2.0 का इस्तेमाल करना

इस दस्तावेज़ में बताया गया है कि वेब सर्वर ऐप्लिकेशन, Google API को ऐक्सेस करने के लिए, OAuth 2.0 की अनुमति लागू करने के लिए, Google API क्लाइंट लाइब्रेरी या Google 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में चालू करना होगा.

अपने प्रोजेक्ट के लिए एपीआई चालू करने के लिए:

  1. Google API Consoleमें Open the API Library .
  2. If prompted, select a project, or create a new one.
  3. API Library में, प्रॉडक्ट फ़ैमिली और लोकप्रियता के हिसाब से, सभी उपलब्ध एपीआई की सूची होती है. आपको जिस एपीआई को चालू करना है, अगर वह सूची में नहीं दिख रहा है, तो उसे ढूंढने के लिए खोजें का इस्तेमाल करें. इसके अलावा, वह प्रॉडक्ट फ़ैमिली के सभी देखें पर क्लिक करें.
  4. वह एपीआई चुनें जिसे आपको चालू करना है, फिर चालू करें बटन पर क्लिक करें.
  5. If prompted, enable billing.
  6. If prompted, read and accept the API's Terms of Service.

अनुमति देने के लिए क्रेडेंशियल बनाएं

Google API को ऐक्सेस करने के लिए OAuth 2.0 का इस्तेमाल करने वाले किसी भी ऐप्लिकेशन में, अनुमति देने वाले क्रेडेंशियल होने चाहिए, जो Google के OAuth 2.0 सर्वर पर उस ऐप्लिकेशन की पहचान करते हों. अपने प्रोजेक्ट के लिए क्रेडेंशियल बनाने का तरीका नीचे बताया गया है. इसके बाद, आपके ऐप्लिकेशन उन एपीआई को ऐक्सेस करने के लिए क्रेडेंशियल का इस्तेमाल कर सकते हैं जिन्हें आपने उस प्रोजेक्ट के लिए चालू किया है.

  1. Go to the Credentials page.
  2. क्रेडेंशियल बनाएं > OAuth क्लाइंट आईडी पर क्लिक करें.
  3. वेब ऐप्लिकेशन ऐप्लिकेशन का टाइप चुनें.
  4. फ़ॉर्म भरें और बनाएं पर क्लिक करें. 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
  • Blask Python वेब ऐप्लिकेशन फ़्रेमवर्क.
    pip install --upgrade flask
  • requests एचटीटीपी लाइब्रेरी.
    pip install --upgrade requests

Ruby

इस दस्तावेज़ में Ruby कोड के सैंपल चलाने के लिए, आपको इनकी ज़रूरत होगी:

  • Ruby 2.6 या इसके बाद का वर्शन
  • Ruby के लिए Google Auth लाइब्रेरी:

    gem install googleauth
  • Siatra 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 अनुरोध पर काम शुरू कर सके जिसके लिए उपयोगकर्ता की अनुमति ज़रूरी है.

नीचे दी गई सूची में इन चरणों के बारे में खास जानकारी दी गई है:

  1. आपका ऐप्लिकेशन उन अनुमतियों की पहचान करता है जिनकी उसे ज़रूरत है.
  2. आपका ऐप्लिकेशन, उपयोगकर्ता को मांगी गई अनुमतियों की सूची के साथ Google पर रीडायरेक्ट करता है.
  3. उपयोगकर्ता तय करता है कि आपके ऐप्लिकेशन को अनुमतियां देनी हैं या नहीं.
  4. आपके ऐप्लिकेशन को यह पता चल जाता है कि उपयोगकर्ता ने क्या फ़ैसला लिया था.
  5. अगर उपयोगकर्ता ने अनुरोध की गई अनुमतियां दी हैं, तो आपका ऐप्लिकेशन, उपयोगकर्ता की ओर से एपीआई अनुरोध करने के लिए ज़रूरी टोकन फिर से हासिल करता है.

पहला चरण: अनुमति देने वाले पैरामीटर सेट करना

आपका पहला चरण अनुमति देने का अनुरोध करना है. इस अनुरोध की वजह से, ऐसे पैरामीटर सेट किए जाते हैं जो आपके ऐप्लिकेशन की पहचान करते हैं और वे अनुमतियां तय करते हैं जो उपयोगकर्ता से आपके ऐप्लिकेशन को देने के लिए मांगी जाएंगी.

  • अगर 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();

// 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\Drive::DRIVE_METADATA_READONLY);

// 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 पैरामीटर सेट करता है.

उदाहरण के लिए, यह कोड किसी उपयोगकर्ता की Google Drive को सिर्फ़ पढ़ने के लिए, ऑफ़लाइन ऐक्सेस का अनुरोध करता है:

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/drive.metadata.readonly'])

# 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',
    # Recommended, state value can increase your assurance that an incoming connection is the result
    # of an authentication request.
    state=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.
    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 सर्वर से मिलने वाले रिस्पॉन्स को मैनेज करेगा.

उदाहरण के लिए, यह कोड किसी उपयोगकर्ता की 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')

आपका ऐप्लिकेशन, OAuth 2.0 से जुड़ी कार्रवाइयां करने के लिए क्लाइंट ऑब्जेक्ट का इस्तेमाल करता है. जैसे, अनुमति देने के अनुरोध के यूआरएल जनरेट करना और एचटीटीपी अनुरोधों पर ऐक्सेस टोकन लागू करना.

Node.js

नीचे दिया गया कोड स्निपेट एक google.auth.OAuth2 ऑब्जेक्ट बनाता है, जो अनुमति पाने के अनुरोध में पैरामीटर के बारे में बताता है.

वह ऑब्जेक्ट आपके ऐप्लिकेशन की पहचान करने के लिए, आपकी client_secret.json फ़ाइल की जानकारी का इस्तेमाल करता है. किसी उपयोगकर्ता से ऐक्सेस टोकन पाने के लिए अनुमतियां मांगने के लिए, उसे सहमति वाले पेज पर रीडायरेक्ट किया जाता है. सहमति वाले पेज का यूआरएल बनाने के लिए:

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में कॉन्फ़िगर किया है. अगर यह वैल्यू, दिए गए client_id के लिए अनुमति वाले रीडायरेक्ट यूआरआई से मेल नहीं खाती है, तो आपको redirect_uri_mismatch गड़बड़ी मिलेगी.

ध्यान रखें कि http या https स्कीम, केस, और ट्रेलिंग स्लैश ('/') सभी मेल खाने चाहिए.

response_type ज़रूरी

इससे यह तय होता है कि Google OAuth 2.0 एंडपॉइंट, ऑथराइज़ेशन कोड दिखाता है या नहीं.

वेब सर्वर ऐप्लिकेशन के लिए पैरामीटर वैल्यू को code पर सेट करें.

scope ज़रूरी

दायरों की स्पेस-डीलिमिटेड सूची, जिसमें उन संसाधनों की पहचान की जाती है जिन्हें आपका ऐप्लिकेशन, उपयोगकर्ता की ओर से ऐक्सेस कर सकता है. ये वैल्यू, सहमति वाली उस स्क्रीन के बारे में बताती हैं जिसे Google, उपयोगकर्ता को दिखाता है.

दायरों की मदद से आपका ऐप्लिकेशन, सिर्फ़ उन संसाधनों के ऐक्सेस का अनुरोध कर सकता है जिनकी उसे ज़रूरत है. साथ ही, उपयोगकर्ताओं को यह कंट्रोल करने की सुविधा भी मिलती है कि वे आपके ऐप्लिकेशन को कितने ऐक्सेस दें. इसलिए, अनुरोध किए गए दायरों की संख्या और उपयोगकर्ता की सहमति लेने की संभावना के बीच फ़र्क़ होता है.

हमारा सुझाव है कि जब भी मुमकिन हो, आपका ऐप्लिकेशन अपने हिसाब से अनुमति वाले दायरों का ऐक्सेस मांगे. इंक्रीमेंटल अनुमति की मदद से, उपयोगकर्ता के डेटा का ऐक्सेस पाने के लिए अनुरोध करें. इससे, उपयोगकर्ताओं को आसानी से यह समझने में मदद मिलती है कि आपके ऐप्लिकेशन को उसकी ऐक्सेस की ज़रूरत क्यों है.

access_type सुझाया गया

इससे पता चलता है कि ब्राउज़र पर उपयोगकर्ता के मौजूद न होने पर, आपका ऐप्लिकेशन ऐक्सेस टोकन को रीफ़्रेश कर सकता है या नहीं. पैरामीटर की मान्य वैल्यू online, डिफ़ॉल्ट वैल्यू, और offline है.

अगर उपयोगकर्ता के ब्राउज़र पर मौजूद न होने पर, आपके ऐप्लिकेशन को ऐक्सेस टोकन रीफ़्रेश करने की ज़रूरत पड़ती है, तो वैल्यू को offline पर सेट करें. यह ऐक्सेस टोकन को रीफ़्रेश करने का तरीका है, जिसके बारे में इस दस्तावेज़ में बाद में बताया गया है. जब आपका ऐप्लिकेशन पहली बार टोकन के लिए ऑथराइज़ेशन कोड की अदला-बदली करता है, तब यह वैल्यू Google के ऑथराइज़ेशन सर्वर को रीफ़्रेश टोकन और ऐक्सेस टोकन लौटाने का निर्देश देती है.

state सुझाया गया

इस कॉलम से ऐसी स्ट्रिंग की जानकारी मिलती है जिसका इस्तेमाल आपका ऐप्लिकेशन, अनुमति देने के आपके अनुरोध और अनुमति देने वाले सर्वर के रिस्पॉन्स के बीच स्थिति बनाए रखने के लिए करता है. सर्वर ठीक वही वैल्यू दिखाता है जिसे आपने redirect_uri के यूआरएल क्वेरी कॉम्पोनेंट (?) में, name=value पेयर के तौर पर भेजा है. ऐसा तब होता है, जब उपयोगकर्ता आपके ऐप्लिकेशन के ऐक्सेस के अनुरोध के लिए सहमति देता है या उसे अस्वीकार करता है.

इस पैरामीटर का इस्तेमाल कई कामों के लिए किया जा सकता है. जैसे, उपयोगकर्ता को अपने ऐप्लिकेशन में सही रिसॉर्स पर ले जाना, नॉन्स भेजना, और क्रॉस-साइट से जुड़ी जालसाज़ी के अनुरोध को कम करना. आपके redirect_uri का अनुमान आसानी से लगाया जा सकता है, इसलिए state वैल्यू का इस्तेमाल करने से यह भरोसा बढ़ सकता है कि पुष्टि करने के अनुरोध की वजह से कनेक्शन मिला है. अगर क्लाइंट की स्थिति को कैप्चर करने वाली कोई रैंडम स्ट्रिंग या किसी कुकी या अन्य वैल्यू के हैश को कोड में बदला जाता है, तो रिस्पॉन्स की पुष्टि की जा सकती है. इससे यह भी पक्का किया जा सकता है कि अनुरोध और रिस्पॉन्स एक ही ब्राउज़र से आए हैं. इससे, क्रॉस-साइट अनुरोध की जालसाज़ी जैसे हमलों से सुरक्षा मिलती है. state टोकन बनाने और उसकी पुष्टि करने के तरीके के बारे में जानने के लिए, OpenID Connect का दस्तावेज़ देखें.

include_granted_scopes ज़रूरी नहीं

ऐप्लिकेशन को इंक्रीमेंटल अनुमति का इस्तेमाल करने की अनुमति देता है, ताकि कॉन्टेक्स्ट में अन्य दायरों का ऐक्सेस पाने का अनुरोध किया जा सके. अगर इस पैरामीटर की वैल्यू को true पर सेट किया जाता है और अनुमति देने का अनुरोध किया जाता है, तो नए ऐक्सेस टोकन में वे सभी दायरे भी शामिल होंगे जिनके लिए उपयोगकर्ता ने पहले ऐप्लिकेशन का ऐक्सेस दिया था. उदाहरणों के लिए, इंक्रीमेंटल अनुमति सेक्शन देखें.

login_hint ज़रूरी नहीं

अगर आपके ऐप्लिकेशन को पता है कि कौनसा उपयोगकर्ता पुष्टि करने की कोशिश कर रहा है, तो वह इस पैरामीटर का इस्तेमाल करके, Google ऑथेंटिकेशन सर्वर को संकेत दे सकता है. सर्वर इस संकेत का इस्तेमाल करके, लॉगिन फ़्लो को आसान बनाता है. इसके लिए, साइन-इन फ़ॉर्म में ईमेल फ़ील्ड में पहले से जानकारी भरी जाती है या एक से ज़्यादा बार लॉगिन किए जाने वाले सही सेशन को चुना जाता है.

पैरामीटर वैल्यू को किसी ईमेल पते या sub आइडेंटिफ़ायर पर सेट करें, जो उपयोगकर्ता के Google आईडी की तरह हो.

prompt ज़रूरी नहीं

उपयोगकर्ता को पेश करने के लिए प्रॉम्प्ट की स्पेस-डीलिमिटेड, केस-सेंसिटिव (बड़े और छोटे अक्षरों में अंतर) वाली सूची. अगर इस पैरामीटर के बारे में कोई जानकारी नहीं दी जाती है, तो उपयोगकर्ता को सूचना सिर्फ़ तब दी जाएगी, जब आपके प्रोजेक्ट ने ऐक्सेस का अनुरोध किया होगा. ज़्यादा जानकारी के लिए, फिर से सहमति देने का अनुरोध करना लेख देखें.

आपको ये वैल्यू दिख सकती हैं:

none पुष्टि करने वाली या सहमति वाली कोई स्क्रीन न दिखाएं. दूसरी वैल्यू के साथ जानकारी नहीं दी जानी चाहिए.
consent उपयोगकर्ता को सहमति के लिए अनुरोध भेजें.
select_account उपयोगकर्ता से खाता चुनने का अनुरोध करें.

दूसरा चरण: Google के OAuth 2.0 सर्वर पर रीडायरेक्ट करना

पुष्टि करने और अनुमति देने की प्रोसेस शुरू करने के लिए, उपयोगकर्ता को Google के OAuth 2.0 सर्वर पर रीडायरेक्ट करें. आम तौर पर, ऐसा तब होता है, जब आपके ऐप्लिकेशन को पहली बार उपयोगकर्ता का डेटा ऐक्सेस करने की ज़रूरत होती है. इंक्रीमेंटल अनुमति के मामले में, यह चरण तब भी लागू होता है, जब आपके ऐप्लिकेशन को पहली बार उन अतिरिक्त संसाधनों को ऐक्सेस करने की ज़रूरत होती है जिन्हें ऐक्सेस करने की अनुमति उसके पास नहीं होती.

PHP

  1. Google के OAuth 2.0 सर्वर से ऐक्सेस का अनुरोध करने के लिए, यूआरएल जनरेट करें:
    $auth_url = $client->createAuthUrl();
  2. उपयोगकर्ता को $auth_url पर रीडायरेक्ट करें:
    header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));

Python

इस उदाहरण में, Flask वेब ऐप्लिकेशन फ़्रेमवर्क का इस्तेमाल करके, उपयोगकर्ता को अनुमति वाले यूआरएल पर रीडायरेक्ट करने का तरीका बताया गया है:

return flask.redirect(authorization_url)

Ruby

  1. Google के OAuth 2.0 सर्वर से ऐक्सेस का अनुरोध करने के लिए, यूआरएल जनरेट करें:
    auth_uri = authorizer.get_authorization_url(login_hint: user_id, request: request)
  2. उपयोगकर्ता को auth_uri पर रीडायरेक्ट करें.

Node.js

  1. Google के OAuth 2.0 सर्वर से ऐक्सेस का अनुरोध करने के लिए, पहला चरण generateAuthUrl तरीके से जनरेट किए गए यूआरएल authorizationUrl का इस्तेमाल करें.
  2. उपयोगकर्ता को authorizationUrl पर रीडायरेक्ट करें.
    res.writeHead(301, { "Location": authorizationUrl });

HTTP/REST

Sample redirect to Google's authorization server

An example URL is shown below, with line breaks and spaces for readability.

https://accounts.google.com/o/oauth2/v2/auth?
 scope=https%3A//www.googleapis.com/auth/drive.metadata.readonly&
 access_type=offline&
 include_granted_scopes=true&
 response_type=code&
 state=state_parameter_passthrough_value&
 redirect_uri=https%3A//oauth2.example.com/code&
 client_id=client_id

अनुरोध का यूआरएल बनाने के बाद, उपयोगकर्ता को उस पर रीडायरेक्ट करें.

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

तीसरा चरण: Google, उपयोगकर्ता से सहमति के लिए अनुरोध करता है

इस चरण में, उपयोगकर्ता तय करता है कि आपके ऐप्लिकेशन को अनुरोध किया गया ऐक्सेस देना है या नहीं. इस चरण में, Google एक सहमति विंडो दिखाता है. इसमें आपके ऐप्लिकेशन का नाम और उन Google API सेवाओं का नाम दिखता है जिन्हें ऐक्सेस करने के लिए, वह उपयोगकर्ता के ऑथराइज़ेशन क्रेडेंशियल और दिए जाने वाले ऐक्सेस के दायरों की खास जानकारी देता है. इसके बाद उपयोगकर्ता, आपके ऐप्लिकेशन के अनुरोध किए गए एक या उससे ज़्यादा दायरों का ऐक्सेस देने की सहमति दे सकता है या अनुरोध को अस्वीकार कर सकता है.

इस चरण में आपके ऐप्लिकेशन को कुछ करने की ज़रूरत नहीं है, क्योंकि वह Google के OAuth 2.0 सर्वर से रिस्पॉन्स मिलने का इंतज़ार करता है, जिससे यह पता चलता है कि कोई ऐक्सेस दिया गया है या नहीं. इस जवाब के बारे में अगले चरण में बताया गया है.

गड़बड़ियां

Google के OAuth 2.0 ऑथराइज़ेशन एंडपॉइंट के अनुरोध पर, पुष्टि करने और ऑथराइज़ेशन फ़्लो की उम्मीद के बजाय, उपयोगकर्ता को मिलने वाले गड़बड़ी के मैसेज दिख सकते हैं. आम गड़बड़ी कोड और सुझाए गए समाधान नीचे दिए गए हैं.

admin_policy_enforced

Google खाते के Google Workspace एडमिन की नीतियों की वजह से, अनुरोध किए गए एक या उससे ज़्यादा दायरों को अनुमति नहीं दी जा सकती. Google Workspace एडमिन के लिए सहायता लेख पढ़ें यह कंट्रोल करें कि तीसरे पक्ष और आपके डोमेन के मालिकाना हक वाले कौनसे ऐप्लिकेशन, Google Workspace का डेटा ऐक्सेस करते हैं इस बारे में ज़्यादा जानकारी पाएं कि एडमिन, आपके OAuth क्लाइंट आईडी का ऐक्सेस साफ़ तौर पर मिलने तक, सभी स्कोप या संवेदनशील और पाबंदी वाले दायरों के ऐक्सेस पर पाबंदी कैसे लगा सकता है.

disallowed_useragent

ऑथराइज़ेशन एंडपॉइंट, एम्बेड किए गए ऐसे उपयोगकर्ता-एजेंट के अंदर दिखाया जाता है जिसे Google की OAuth 2.0 नीतियों के मुताबिक अनुमति नहीं है.

Android

android.webkit.WebView में अनुमति के अनुरोध खोलते समय, Android डेवलपर को गड़बड़ी का यह मैसेज दिख सकता है. इसके बजाय, डेवलपर को Android लाइब्रेरी का इस्तेमाल करना चाहिए. जैसे, Android के लिए 'Google साइन-इन' या UPI फ़ाउंडेशन का Android के लिए AppAuth.

जब कोई Android ऐप्लिकेशन, एम्बेड किए गए उपयोगकर्ता-एजेंट में कोई सामान्य वेब लिंक खोलता है और कोई उपयोगकर्ता आपकी साइट से Google के OAuth 2.0 ऑथराइज़ेशन एंडपॉइंट पर जाता है, तो वेब डेवलपर को यह गड़बड़ी दिख सकती है. डेवलपर को ऑपरेटिंग सिस्टम के डिफ़ॉल्ट लिंक हैंडलर में सामान्य लिंक खोलने की अनुमति देनी चाहिए. इनमें Android ऐप्लिकेशन के लिंक हैंडलर या डिफ़ॉल्ट ब्राउज़र ऐप्लिकेशन, दोनों शामिल हैं. Android की कस्टम टैब लाइब्रेरी का इस्तेमाल भी किया जा सकता है.

iOS

iOS और macOS डेवलपर को WKWebView में अनुमति के अनुरोध खोलते समय यह गड़बड़ी दिख सकती है. इसके बजाय, डेवलपर को iOS लाइब्रेरी का इस्तेमाल करना चाहिए, जैसे कि iOS के लिए 'Google साइन-इन' या UPI फ़ाउंडेशन के iOS के लिए AppAuth.

जब कोई iOS या macOS ऐप्लिकेशन, एम्बेड किए गए किसी उपयोगकर्ता-एजेंट में कोई सामान्य वेब लिंक खोलता है और कोई उपयोगकर्ता आपकी साइट से, Google के OAuth 2.0 ऑथराइज़ेशन एंडपॉइंट पर नेविगेट करता है, तो वेब डेवलपर को यह गड़बड़ी दिख सकती है. डेवलपर को ऑपरेटिंग सिस्टम के डिफ़ॉल्ट लिंक हैंडलर में सामान्य लिंक खोलने की अनुमति देनी चाहिए. इसमें, Universal लिंक हैंडलर या डिफ़ॉल्ट ब्राउज़र ऐप्लिकेशन, दोनों शामिल हैं. 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 को कॉल करने के लिए, ऐक्सेस टोकन का इस्तेमाल करें. इसके लिए, यह तरीका अपनाएं:

  1. अगर आपको किसी नए Google\Client ऑब्जेक्ट पर ऐक्सेस टोकन लागू करना है — उदाहरण के लिए, अगर आपने उपयोगकर्ता सेशन में ऐक्सेस टोकन सेव किया है — तो, setAccessToken तरीके का इस्तेमाल करें:
    $client->setAccessToken($access_token);
  2. उस एपीआई के लिए सेवा ऑब्जेक्ट बनाएं जिसे आपको कॉल करना है. आपको जिस एपीआई को कॉल करना है उसके कंस्ट्रक्टर को अनुमति वाला Google\Client ऑब्जेक्ट देकर, सर्विस ऑब्जेक्ट बनाया जा सकता है. उदाहरण के लिए, Drive API को कॉल करने के लिए:
    $drive = new Google\Service\Drive($client);
  3. सेवा ऑब्जेक्ट से मिले इंटरफ़ेस का इस्तेमाल करके, एपीआई सेवा को अनुरोध करें. उदाहरण के लिए, पुष्टि किए गए उपयोगकर्ता के Google Drive में फ़ाइलों को शामिल करने के लिए:
    $files = $drive->files->listFiles(array())->getItems();

Python

ऐक्सेस टोकन पाने के बाद, आपका ऐप्लिकेशन उस टोकन का इस्तेमाल करके, किसी उपयोगकर्ता खाते या सेवा खाते की ओर से एपीआई अनुरोधों को अनुमति दे सकता है. आपको जिस एपीआई को कॉल करना है उसके लिए सेवा ऑब्जेक्ट बनाने के लिए, उपयोगकर्ता के खास अनुमति देने के क्रेडेंशियल का इस्तेमाल करें. इसके बाद, उस ऑब्जेक्ट का इस्तेमाल करके अनुमति वाले एपीआई अनुरोध करें.

  1. उस एपीआई के लिए सेवा ऑब्जेक्ट बनाएं जिसे आपको कॉल करना है. एपीआई के नाम, वर्शन, और उपयोगकर्ता क्रेडेंशियल के साथ googleapiclient.discovery लाइब्रेरी के build तरीके को कॉल करके, सर्विस ऑब्जेक्ट बनाया जाता है: उदाहरण के लिए, Drive API के वर्शन 3 को कॉल करने के लिए:
    from googleapiclient.discovery import build
    
    drive = build('drive', 'v2', credentials=credentials)
  2. सेवा ऑब्जेक्ट से मिले इंटरफ़ेस का इस्तेमाल करके, एपीआई सेवा को अनुरोध करें. उदाहरण के लिए, पुष्टि किए गए उपयोगकर्ता के Google Drive में फ़ाइलों को शामिल करने के लिए:
    files = drive.files().list().execute()

Ruby

ऐक्सेस टोकन पाने के बाद, आपका ऐप्लिकेशन उस टोकन का इस्तेमाल करके, किसी उपयोगकर्ता खाते या सेवा खाते की ओर से एपीआई अनुरोध कर सकता है. आपको जिस एपीआई को कॉल करना है उसके लिए सेवा ऑब्जेक्ट बनाने के लिए, उपयोगकर्ता के खास अनुमति देने के क्रेडेंशियल का इस्तेमाल करें. इसके बाद, उस ऑब्जेक्ट का इस्तेमाल करके अनुमति वाले एपीआई अनुरोध करें.

  1. उस एपीआई के लिए सेवा ऑब्जेक्ट बनाएं जिसे आपको कॉल करना है. उदाहरण के लिए, Drive API के 3 वर्शन को कॉल करने के लिए:
    drive = Google::Apis::DriveV3::DriveService.new
  2. सेवा के लिए क्रेडेंशियल सेट करें:
    drive.authorization = credentials
  3. सेवा ऑब्जेक्ट से मिले इंटरफ़ेस का इस्तेमाल करके, एपीआई सेवा को अनुरोध करें. उदाहरण के लिए, पुष्टि किए गए उपयोगकर्ता के 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

इस उदाहरण को चलाने के लिए:

  1. API Consoleमें, लोकल मशीन के यूआरएल को रीडायरेक्ट यूआरएल की सूची में जोड़ें. उदाहरण के लिए, http://localhost:8080 जोड़ें.
  2. नई डायरेक्ट्री बनाएं और उसमें बदलाव करें. उदाहरण के लिए:
    mkdir ~/php-oauth2-example
    cd ~/php-oauth2-example
  3. Composer का इस्तेमाल करके, PHP के लिए Google API क्लाइंट लाइब्रेरी इंस्टॉल करें:
    composer require google/apiclient:^2.10
  4. यहां दिए गए कॉन्टेंट का इस्तेमाल करके, index.php और oauth2callback.php फ़ाइलें बनाएं.
  5. 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

इस उदाहरण को चलाने के लिए:

  1. API Consoleमें, लोकल मशीन के यूआरएल को, रीडायरेक्ट यूआरएल की सूची में जोड़ें. उदाहरण के लिए, http://localhost जोड़ें.
  2. पक्का करें कि आपने रखरखाव के एलटीएस, चालू एलटीएस या Node.js की मौजूदा रिलीज़ को इंस्टॉल किया हो.
  3. नई डायरेक्ट्री बनाएं और उसमें बदलाव करें. उदाहरण के लिए:
    mkdir ~/nodejs-oauth2-example
    cd ~/nodejs-oauth2-example
  4. Install the Google API Client Library for Node.js using npm:
    npm install googleapis
  5. नीचे दिए गए कॉन्टेंट का इस्तेमाल करके, main.js फ़ाइलें बनाएं.
  6. उदाहरण चलाएं:
    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 सबकॉम्पोनेंट शामिल नहीं हो सकता.

    पाथ

    रीडायरेक्ट यूआरआई में पाथ ट्रेवर्सल नहीं हो सकता (जिसे डायरेक्ट्री बैकट्रैकिंग भी कहा जाता है). इसे “/..” या “\..” या उनके यूआरएल को कोड में बदलने के तरीके से दिखाया जाता है.

    क्वेरी

    रीडायरेक्ट यूआरआई में ओपन रीडायरेक्ट शामिल नहीं हो सकते.

    फ़्रैगमेंट

    रीडायरेक्ट यूआरआई में फ़्रैगमेंट कॉम्पोनेंट शामिल नहीं हो सकता.

    वर्ण रीडायरेक्ट यूआरआई में कुछ वर्ण नहीं हो सकते, जैसे:
    • वाइल्डकार्ड वर्ण ('*')
    • प्रिंट न किए जा सकने वाले ASCII वर्ण
    • अमान्य प्रतिशत एन्कोडिंग (कोई भी प्रतिशत एन्कोडिंग जो प्रतिशत चिह्न के यूआरएल-एन्कोडिंग फ़ॉर्म के बाद दो हेक्साडेसिमल अंकों का पालन नहीं करती)
    • शून्य वर्ण (एनकोड किया गया NULL वर्ण, उदाहरण के लिए, %00, %C0%80)

    इंक्रीमेंटल अनुमति

    OAuth 2.0 प्रोटोकॉल में, आपका ऐप्लिकेशन संसाधनों को ऐक्सेस करने के लिए अनुमति मांगता है. इन संसाधनों की पहचान स्कोप से की जाती है. जब आपको संसाधनों की ज़रूरत हो, तब उनके लिए अनुमति का अनुरोध करना, उपयोगकर्ता के अनुभव के लिए सबसे सही तरीका माना जाता है. इसे चालू करने के लिए, Google का ऑथराइज़ेशन सर्वर, अतिरिक्त अनुमति देने की सुविधा देता है. इस सुविधा की मदद से, स्कोप की ज़रूरत के हिसाब से उनका अनुरोध किया जा सकता है. अगर उपयोगकर्ता नए स्कोप के लिए अनुमति देता है, तो यह ऑथराइज़ेशन कोड दिखाता है. इस कोड को ऐसे टोकन से बदला जा सकता है जिसमें उपयोगकर्ता ने प्रोजेक्ट को सभी दायरे शामिल किए हों.

    उदाहरण के लिए, ऐसा ऐप्लिकेशन जो लोगों को संगीत ट्रैक का सैंपल बनाने और मिक्स बनाने की सुविधा देता है, हो सकता है कि साइन इन करते समय बहुत कम संसाधनों की ज़रूरत पड़े. शायद साइन इन करने वाले व्यक्ति के नाम के अलावा और कुछ नहीं. हालांकि, बनाए गए मिक्स को सेव करने के लिए, Google Drive को ऐक्सेस करना होगा. ज़्यादातर लोगों को यह सामान्य तब लग सकता है, जब उनसे Google Drive का ऐक्सेस सिर्फ़ उस समय मांगा जाए जब ऐप्लिकेशन को इसकी ज़रूरत हो.

    इस मामले में, साइन इन करते समय ऐप्लिकेशन, बुनियादी साइन इन के लिए openid और profile के दायरे का अनुरोध कर सकता है. इसके बाद, मिक्स सेव करने के पहले अनुरोध पर, ऐप्लिकेशन https://www.googleapis.com/auth/drive.file स्कोप का अनुरोध कर सकता है.

    इंक्रीमेंटल अनुमति को लागू करने के लिए, आपको ऐक्सेस टोकन का अनुरोध करने के सामान्य फ़्लो को पूरा करना होता है. हालांकि, यह पक्का कर लें कि अनुमति के अनुरोध में, पहले दिए गए दायरे शामिल हों. इस तरीके से आपका ऐप्लिकेशन, कई ऐक्सेस टोकन को मैनेज करने से बचता है.

    इंक्रीमेंटल अनुमति से मिलने वाले ऐक्सेस टोकन पर ये नियम लागू होते हैं:

    • टोकन का इस्तेमाल, अनुमति देने की नई और मिली-जुली अनुमति में रोल किए गए किसी भी दायरे से जुड़े संसाधनों को ऐक्सेस करने के लिए किया जा सकता है.
    • जब ऐक्सेस टोकन पाने के लिए, मिले-जुले अनुमति के लिए रीफ़्रेश टोकन का इस्तेमाल किया जाता है, तो ऐक्सेस टोकन, मिली-जुली अनुमति को दिखाता है. इसका इस्तेमाल रिस्पॉन्स में शामिल किसी भी scope वैल्यू के लिए किया जा सकता है.
    • मिली-जुली अनुमति में, वे सभी दायरे शामिल होते हैं जो उपयोगकर्ता ने एपीआई प्रोजेक्ट को दिए थे. भले ही, अलग-अलग क्लाइंट से अनुमति का अनुरोध किया गया हो. उदाहरण के लिए, अगर किसी उपयोगकर्ता ने किसी ऐप्लिकेशन के डेस्कटॉप क्लाइंट का इस्तेमाल करके, एक स्कोप का ऐक्सेस दिया है और फिर किसी मोबाइल क्लाइंट से उसी ऐप्लिकेशन को दूसरा स्कोप दिया, तो दोनों स्कोप को एक साथ इस्तेमाल करने की अनुमति में, दोनों स्कोप शामिल होंगे.
    • अगर अनुमति देने वाले किसी टोकन को रद्द किया जाता है, तो जोड़े गए उपयोगकर्ता की ओर से, उस अनुमति के सभी दायरों का ऐक्सेस एक साथ रद्द कर दिया जाएगा.

    पहला चरण: अनुमति देने वाले पैरामीटर सेट करें में दिए गए किसी भाषा के खास कोड सैंपल और दूसरा चरण: Google के OAuth 2.0 सर्वर पर रीडायरेक्ट करना में उपलब्ध एचटीटीपी/REST रीडायरेक्ट यूआरएल का सैंपल. ये सभी, अनुमति देने के अतिरिक्त कदम का इस्तेमाल करते हैं. नीचे दिए गए कोड सैंपल में वह कोड भी दिखाया गया है जिसे आपको इंक्रीमेंटल ऑथराइज़ेशन का इस्तेमाल करने के लिए जोड़ना होगा.

    PHP

    $client->setIncludeGrantedScopes(true);

    Python

    Python में, include_granted_scopes कीवर्ड आर्ग्युमेंट को true पर सेट करें. इससे यह पक्का किया जा सकेगा कि अनुमति देने के अनुरोध में, पहले दिए गए स्कोप शामिल हैं या नहीं. ऐसा हो सकता है कि include_granted_scopes वह सिर्फ़ कीवर्ड आर्ग्युमेंट न हो जिसे आपने सेट किया है, जैसा कि नीचे दिए गए उदाहरण में दिखाया गया है.

    authorization_url, state = flow.authorization_url(
        # Enable offline access so that you can refresh an access token without
        # re-prompting the user for permission. Recommended for web server apps.
        access_type='offline',
        # Enable incremental authorization. Recommended as a best practice.
        include_granted_scopes='true')

    Ruby

    auth_client.update!(
      :additional_parameters => {"include_granted_scopes" => "true"}
    )

    Node.js

    const authorizationUrl = oauth2Client.generateAuthUrl({
      // 'online' (default) or 'offline' (gets refresh_token)
      access_type: 'offline',
      /** Pass in the scopes array defined above.
        * Alternatively, if only one scope is needed, you can pass a scope URL as a string */
      scope: scopes,
      // Enable incremental authorization. Recommended as a best practice.
      include_granted_scopes: true
    });
    

    एचटीटीपी/REST

    GET https://accounts.google.com/o/oauth2/v2/auth?
      client_id=your_client_id&
      response_type=code&
      state=state_parameter_passthrough_value&
      scope=https%3A//www.googleapis.com/auth/drive.file&
      redirect_uri=https%3A//oauth2.example.com/code&
      prompt=consent&
      include_granted_scopes=true

    ऐक्सेस टोकन को रीफ़्रेश करना (ऑफ़लाइन ऐक्सेस)

    ऐक्सेस टोकन की समयसीमा खत्म हो जाती है. इस वजह से, ये किसी मिलते-जुलते एपीआई अनुरोध के लिए अमान्य क्रेडेंशियल बन जाते हैं. अगर आपने टोकन से जुड़े दायरों के ऑफ़लाइन ऐक्सेस का अनुरोध किया है, तो उपयोगकर्ता को अनुमति के लिए अनुरोध किए बिना, ऐक्सेस टोकन को रीफ़्रेश किया जा सकता है. ऐसा तब भी किया जा सकता है, जब उपयोगकर्ता मौजूद न हो.

    • अगर Google API क्लाइंट लाइब्रेरी का इस्तेमाल किया जाता है, तो क्लाइंट ऑब्जेक्ट ज़रूरत के हिसाब से ऐक्सेस टोकन को रीफ़्रेश करता है. ऐसा तब तक होता है, जब तक उस ऑब्जेक्ट को ऑफ़लाइन ऐक्सेस के लिए कॉन्फ़िगर किया जाता है.
    • अगर क्लाइंट लाइब्रेरी का इस्तेमाल नहीं किया जा रहा है, तो उपयोगकर्ता को Google के OAuth 2.0 सर्वर पर रीडायरेक्ट करते समय, आपको access_type एचटीटीपी क्वेरी पैरामीटर को offline पर सेट करना होगा. ऐसे में, जब ऐक्सेस टोकन के लिए ऑथराइज़ेशन कोड की अदला-बदली की जाती है, तो Google का ऑथराइज़ेशन सर्वर रीफ़्रेश टोकन दिखाता है. इसके बाद, अगर ऐक्सेस टोकन की समयसीमा खत्म हो जाती है या यह किसी अन्य समय पर होता है, तो नया ऐक्सेस टोकन पाने के लिए रीफ़्रेश टोकन का इस्तेमाल किया जा सकता है.

    ऑफ़लाइन ऐक्सेस का अनुरोध करना, ऐसे किसी भी ऐप्लिकेशन के लिए ज़रूरी है जिसे उपयोगकर्ता के मौजूद न होने पर, Google API को ऐक्सेस करने की ज़रूरत होती है. उदाहरण के लिए, जो ऐप्लिकेशन पहले से तय समय पर बैकअप सेवाएं करता है या कार्रवाइयां करता है उसे उपयोगकर्ता के मौजूद न होने पर, अपने ऐक्सेस टोकन को रीफ़्रेश करने की अनुमति होनी चाहिए. ऐक्सेस की डिफ़ॉल्ट स्टाइल को online कहा जाता है.

    अनुमति देने की प्रक्रिया के दौरान, सर्वर साइड वेब ऐप्लिकेशन, इंस्टॉल किए गए ऐप्लिकेशन, और डिवाइसों को रीफ़्रेश टोकन मिलते हैं. रीफ़्रेश टोकन का इस्तेमाल आम तौर पर क्लाइंट-साइड (JavaScript) वेब ऐप्लिकेशन में नहीं किया जाता है.

    PHP

    अगर आपके ऐप्लिकेशन को Google API का ऑफ़लाइन ऐक्सेस चाहिए, तो एपीआई क्लाइंट के ऐक्सेस टाइप को offline पर सेट करें:

    $client->setAccessType("offline");

    जब कोई उपयोगकर्ता, अनुरोध किए गए दायरों का ऑफ़लाइन ऐक्सेस दे देता है, तब उसके ऑफ़लाइन होने पर भी, उपयोगकर्ता की तरफ़ से Google API को ऐक्सेस करने के लिए, एपीआई क्लाइंट का इस्तेमाल जारी रखा जा सकता है. क्लाइंट ऑब्जेक्ट, ज़रूरत के हिसाब से ऐक्सेस टोकन को रीफ़्रेश कर देगा.

    Python

    Python में, access_type कीवर्ड आर्ग्युमेंट को offline पर सेट करें. इससे यह पक्का किया जा सकेगा कि आपके पास, ऐक्सेस टोकन को रीफ़्रेश करने का विकल्प है. इसके लिए, आपको उपयोगकर्ता से अनुमति के लिए फिर से अनुरोध करने की ज़रूरत नहीं है. ऐसा हो सकता है कि access_type वह सिर्फ़ कीवर्ड आर्ग्युमेंट न हो जिसे आपने सेट किया है, जैसा कि नीचे दिए गए उदाहरण में दिखाया गया है.

    authorization_url, state = flow.authorization_url(
        # Enable offline access so that you can refresh an access token without
        # re-prompting the user for permission. Recommended for web server apps.
        access_type='offline',
        # Enable incremental authorization. Recommended as a best practice.
        include_granted_scopes='true')

    जब कोई उपयोगकर्ता, अनुरोध किए गए दायरों का ऑफ़लाइन ऐक्सेस दे देता है, तब उसके ऑफ़लाइन होने पर भी, उपयोगकर्ता की तरफ़ से Google API को ऐक्सेस करने के लिए, एपीआई क्लाइंट का इस्तेमाल जारी रखा जा सकता है. क्लाइंट ऑब्जेक्ट, ज़रूरत के हिसाब से ऐक्सेस टोकन को रीफ़्रेश कर देगा.

    Ruby

    अगर आपके ऐप्लिकेशन को Google API का ऑफ़लाइन ऐक्सेस चाहिए, तो एपीआई क्लाइंट के ऐक्सेस टाइप को offline पर सेट करें:

    auth_client.update!(
      :additional_parameters => {"access_type" => "offline"}
    )

    जब कोई उपयोगकर्ता, अनुरोध किए गए दायरों का ऑफ़लाइन ऐक्सेस दे देता है, तब उसके ऑफ़लाइन होने पर भी, उपयोगकर्ता की तरफ़ से Google API को ऐक्सेस करने के लिए, एपीआई क्लाइंट का इस्तेमाल जारी रखा जा सकता है. क्लाइंट ऑब्जेक्ट, ज़रूरत के हिसाब से ऐक्सेस टोकन को रीफ़्रेश कर देगा.

    Node.js

    अगर आपके ऐप्लिकेशन को Google API का ऑफ़लाइन ऐक्सेस चाहिए, तो एपीआई क्लाइंट के ऐक्सेस टाइप को offline पर सेट करें:

    const authorizationUrl = oauth2Client.generateAuthUrl({
      // 'online' (default) or 'offline' (gets refresh_token)
      access_type: 'offline',
      /** Pass in the scopes array defined above.
        * Alternatively, if only one scope is needed, you can pass a scope URL as a string */
      scope: scopes,
      // Enable incremental authorization. Recommended as a best practice.
      include_granted_scopes: true
    });
    

    जब कोई उपयोगकर्ता, अनुरोध किए गए दायरों का ऑफ़लाइन ऐक्सेस दे देता है, तब उसके ऑफ़लाइन होने पर भी, उपयोगकर्ता की तरफ़ से Google API को ऐक्सेस करने के लिए, एपीआई क्लाइंट का इस्तेमाल जारी रखा जा सकता है. क्लाइंट ऑब्जेक्ट, ज़रूरत के हिसाब से ऐक्सेस टोकन को रीफ़्रेश कर देगा.

    ऐक्सेस टोकन की समयसीमा खत्म हो गई है. अगर ऐक्सेस टोकन की समयसीमा खत्म होने वाली है, तो यह लाइब्रेरी अपने-आप रीफ़्रेश टोकन का इस्तेमाल करके नया ऐक्सेस टोकन हासिल कर लेगी. टोकन इवेंट का इस्तेमाल करना, यह पक्का करने का एक आसान तरीका है कि आपने हमेशा सबसे हाल के टोकन सेव किए हों:

    oauth2Client.on('tokens', (tokens) => {
      if (tokens.refresh_token) {
        // store the refresh_token in your secure persistent database
        console.log(tokens.refresh_token);
      }
      console.log(tokens.access_token);
    });

    यह टोकन इवेंट, सिर्फ़ पहली बार अनुमति देने के दौरान होता है. रीफ़्रेश टोकन पाने के लिए, आपको generateAuthUrl तरीके को कॉल करते समय access_type को offline पर सेट करना होगा. अगर आपने रीफ़्रेश टोकन पाने के लिए उचित सीमाएं सेट किए बिना अपने ऐप्लिकेशन को पहले ही ज़रूरी अनुमतियां दे दी हैं, तो आपको नया रीफ़्रेश टोकन पाने के लिए ऐप्लिकेशन को फिर से अनुमति देनी होगी.

    refresh_token को बाद में सेट करने के लिए, setCredentials तरीके का इस्तेमाल करें:

    oauth2Client.setCredentials({
      refresh_token: `STORED_REFRESH_TOKEN`
    });
    

    क्लाइंट को रीफ़्रेश टोकन मिलने के बाद, एपीआई को अगले कॉल में ऐक्सेस टोकन अपने-आप मिल जाएंगे और उन्हें रीफ़्रेश कर दिया जाएगा.

    एचटीटीपी/REST

    ऐक्सेस टोकन को रीफ़्रेश करने के लिए, आपका ऐप्लिकेशन Google के ऑथराइज़ेशन सर्वर (https://oauth2.googleapis.com/token) को एचटीटीपीएस POST अनुरोध भेजता है. इस अनुरोध में ये पैरामीटर शामिल होते हैं:

    फ़ील्ड
    client_id API Consoleसे मिला क्लाइंट आईडी.
    client_secret API Consoleसे मिला क्लाइंट सीक्रेट.
    grant_type जैसा कि OAuth 2.0 स्पेसिफ़िकेशन में बताया गया है, इस फ़ील्ड की वैल्यू refresh_token पर सेट होनी चाहिए.
    refresh_token रीफ़्रेश टोकन, ऑथराइज़ेशन कोड एक्सचेंज से मिला है.

    यह स्निपेट एक सैंपल अनुरोध दिखाता है:

    POST /token HTTP/1.1
    Host: oauth2.googleapis.com
    Content-Type: application/x-www-form-urlencoded
    
    client_id=your_client_id&
    client_secret=your_client_secret&
    refresh_token=refresh_token&
    grant_type=refresh_token

    जब तक उपयोगकर्ता, ऐप्लिकेशन को दिया गया ऐक्सेस वापस नहीं लेता, तब तक टोकन सर्वर एक JSON ऑब्जेक्ट दिखाता है, जिसमें नया ऐक्सेस टोकन शामिल होता है. यह स्निपेट, रिस्पॉन्स का एक सैंपल दिखाता है:

    {
      "access_token": "1/fFAGRNJru1FTz70BzhT3Zg",
      "expires_in": 3920,
      "scope": "https://www.googleapis.com/auth/drive.metadata.readonly",
      "token_type": "Bearer"
    }

    ध्यान दें कि जारी किए जाने वाले रीफ़्रेश टोकन की संख्या सीमित होती है. हर क्लाइंट/उपयोगकर्ता कॉम्बिनेशन के लिए एक सीमा और सभी क्लाइंट के लिए, हर उपयोगकर्ता के लिए दूसरी सीमा तय की जाती है. आपको रीफ़्रेश टोकन को लंबे समय तक चलने वाले स्टोरेज में सेव करना चाहिए. साथ ही, जब तक वे मान्य हैं, तब तक उनका इस्तेमाल करते रहना चाहिए. अगर आपका ऐप्लिकेशन बहुत ज़्यादा रीफ़्रेश टोकन का अनुरोध करता है, तो वह इन सीमाओं के दायरे में आ सकता है. ऐसे में, पुराने रीफ़्रेश टोकन काम करना बंद कर देंगे.

    टोकन को रद्द करना

    कुछ मामलों में, हो सकता है कि उपयोगकर्ता किसी ऐप्लिकेशन को दिया गया ऐक्सेस वापस लेना चाहे. उपयोगकर्ता खाता सेटिंग में जाकर, ऐक्सेस रद्द कर सकता है. ज़्यादा जानकारी के लिए, तीसरे पक्ष की उन साइटों और ऐप्लिकेशन के साइट या ऐप्लिकेशन को ऐक्सेस करने की अनुमति हटाएं सेक्शन जिनके पास आपके खाते का ऐक्सेस है सहायता दस्तावेज़ देखें.

    ऐप्लिकेशन को दिए गए ऐक्सेस को प्रोग्राम के हिसाब से रद्द भी कर सकता है. प्रोग्राम के हिसाब से अपने-आप रद्द होना तब ज़रूरी है, जब कोई उपयोगकर्ता सदस्यता छोड़ता है, किसी ऐप्लिकेशन को हटाता है या किसी ऐप्लिकेशन के लिए ज़रूरी एपीआई रिसॉर्स में काफ़ी बदलाव होते हैं. दूसरे शब्दों में, ऐप्लिकेशन को हटाने की प्रोसेस के एक हिस्से में एपीआई अनुरोध भी शामिल हो सकता है. इससे यह पक्का किया जाता है कि ऐप्लिकेशन को पहले दी गई अनुमतियां हटा दी गई हों.

    PHP

    प्रोग्राम की मदद से किसी टोकन को रद्द करने के लिए, revokeToken() को कॉल करें:

    $client->revokeToken();

    Python

    किसी टोकन को प्रोग्राम की मदद से रद्द करने के लिए, https://oauth2.googleapis.com/revoke को एक अनुरोध करें. इसमें वह टोकन, पैरामीटर के तौर पर शामिल होता है और यह Content-Type हेडर सेट करता है:

    requests.post('https://oauth2.googleapis.com/revoke',
        params={'token': credentials.token},
        headers = {'content-type': 'application/x-www-form-urlencoded'})

    Ruby

    किसी टोकन को प्रोग्राम की मदद से रद्द करने के लिए, oauth2.revoke एंडपॉइंट पर एचटीटीपी अनुरोध करें:

    uri = URI('https://oauth2.googleapis.com/revoke')
    response = Net::HTTP.post_form(uri, 'token' => auth_client.access_token)
    

    यह टोकन, ऐक्सेस टोकन या रीफ़्रेश टोकन हो सकता है. अगर टोकन कोई ऐक्सेस टोकन है और उससे जुड़ा रीफ़्रेश टोकन मौजूद है, तो रीफ़्रेश टोकन भी वापस ले लिया जाएगा.

    अगर सहमति रद्द हो जाती है, तो जवाब का स्टेटस कोड 200 होता है. गड़बड़ी की स्थितियों के लिए, स्टेटस कोड 400 के साथ गड़बड़ी का कोड दिखाया जाता है.

    Node.js

    किसी टोकन को प्रोग्राम के हिसाब से रद्द करने के लिए, /revoke एंडपॉइंट पर एचटीटीपीएस पोस्ट अनुरोध करें:

    const https = require('https');
    
    // Build the string for the POST request
    let postData = "token=" + userCredential.access_token;
    
    // Options for POST request to Google's OAuth 2.0 server to revoke a token
    let postOptions = {
      host: 'oauth2.googleapis.com',
      port: '443',
      path: '/revoke',
      method: 'POST',
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Content-Length': Buffer.byteLength(postData)
      }
    };
    
    // Set up the request
    const postReq = https.request(postOptions, function (res) {
      res.setEncoding('utf8');
      res.on('data', d => {
        console.log('Response: ' + d);
      });
    });
    
    postReq.on('error', error => {
      console.log(error)
    });
    
    // Post the request with data
    postReq.write(postData);
    postReq.end();
    

    टोकन पैरामीटर, ऐक्सेस टोकन या रीफ़्रेश टोकन हो सकता है. अगर टोकन कोई ऐक्सेस टोकन है और उससे जुड़ा रीफ़्रेश टोकन मौजूद है, तो रीफ़्रेश टोकन भी वापस ले लिया जाएगा.

    अगर सहमति रद्द हो जाती है, तो जवाब का स्टेटस कोड 200 होता है. गड़बड़ी की स्थितियों के लिए, स्टेटस कोड 400 के साथ गड़बड़ी का कोड दिखाया जाता है.

    एचटीटीपी/REST

    प्रोग्राम की मदद से किसी टोकन को रद्द करने के लिए, आपका ऐप्लिकेशन https://oauth2.googleapis.com/revoke को अनुरोध करता है. साथ ही, इस टोकन को पैरामीटर के तौर पर शामिल करता है:

    curl -d -X -POST --header "Content-type:application/x-www-form-urlencoded" \
            https://oauth2.googleapis.com/revoke?token={token}

    यह टोकन, ऐक्सेस टोकन या रीफ़्रेश टोकन हो सकता है. अगर टोकन कोई ऐक्सेस टोकन है और उससे जुड़ा रीफ़्रेश टोकन मौजूद है, तो रीफ़्रेश टोकन भी वापस ले लिया जाएगा.

    अगर सहमति रद्द हो जाती है, तो जवाब का एचटीटीपी स्टेटस कोड 200 होगा. गड़बड़ी की स्थितियों के लिए, एचटीटीपी स्टेटस कोड 400, गड़बड़ी कोड के साथ दिखाया जाता है.