OpenID कनेक्ट

Google के OAuth 2.0 एपीआई का इस्तेमाल, पुष्टि करने और अनुमति देने, दोनों के लिए किया जा सकता है. इस दस्तावेज़ में, पुष्टि करने के लिए OAuth 2.0 को लागू करने के बारे में बताया गया है. यह OpenID Connect स्पेसिफ़िकेशन के मुताबिक है और OpenID सर्टिफ़ाइड है. OAuth 2.0 का इस्तेमाल करके, Google API को ऐक्सेस करना में मौजूद दस्तावेज़ भी इस सेवा पर लागू होता है. अगर आपको इस प्रोटोकॉल के बारे में इंटरैक्टिव तरीके से जानना है, तो हमारा सुझाव है कि आप Google OAuth 2.0 Playground का इस्तेमाल करें. Stack Overflow पर मदद पाने के लिए, अपने सवालों को 'google-oauth' के साथ टैग करें.

OAuth 2.0 सेट अप करना

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

OAuth 2.0 क्रेडेंशियल पाना

उपयोगकर्ताओं की पुष्टि करने और Google के एपीआई ऐक्सेस करने के लिए, आपको OAuth 2.0 क्रेडेंशियल की ज़रूरत होगी. इनमें क्लाइंट आईडी और क्लाइंट सीक्रेट शामिल हैं.

किसी OAuth 2.0 क्रेडेंशियल के लिए क्लाइंट आईडी और क्लाइंट सीक्रेट देखने के लिए, इस टेक्स्ट पर क्लिक करें: क्रेडेंशियल चुनें. खुलने वाली विंडो में, अपना प्रोजेक्ट और अपनी पसंद के क्रेडेंशियल चुनें. इसके बाद, देखें पर क्लिक करें.

इसके अलावा, Cloud Console में क्लाइंट पेज पर जाकर, अपना क्लाइंट आईडी और क्लाइंट सीक्रेट देखें:

  1. क्लाइंट पेज पर जाएं.
  2. अपने क्लाइंट के नाम या बदलाव करें () आइकॉन पर क्लिक करें. आपका क्लाइंट आईडी और सीक्रेट, पेज पर सबसे ऊपर मौजूद होता है.

रीडायरेक्ट यूआरआई सेट करना

Cloud Console में सेट किया गया रीडायरेक्ट यूआरआई यह तय करता है कि Google, आपके पुष्टि करने के अनुरोधों के जवाब कहां भेजेगा.

किसी OAuth 2.0 क्रेडेंशियल के लिए, रीडायरेक्ट यूआरआई बनाने, देखने या उनमें बदलाव करने के लिए, यह तरीका अपनाएं:

  1. क्लाइंट पेज पर जाएं.
  2. क्लाइंट पर क्लिक करें.
  3. रीडायरेक्ट यूआरआई देखें या उनमें बदलाव करें.

अगर क्लाइंट पेज पर कोई क्लाइंट नहीं दिखता है, तो इसका मतलब है कि आपके प्रोजेक्ट में कोई OAuth क्रेडेंशियल नहीं है. क्लाइंट खाता बनाने के लिए, क्लाइंट खाता बनाएं पर क्लिक करें.

उपयोगकर्ता की सहमति वाली स्क्रीन को पसंद के मुताबिक बनाना

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

उपयोगकर्ता की सहमति वाली स्क्रीन पर, ब्रैंडिंग की जानकारी भी दिखती है. जैसे, आपके प्रॉडक्ट का नाम, लोगो, और होम पेज का यूआरएल. Cloud Console में ब्रैंडिंग की जानकारी को कंट्रोल किया जा सकता है.

अपने प्रोजेक्ट के लिए सहमति वाली स्क्रीन चालू करने के लिए:

  1. Google Cloud Console में, ब्रैंडिंग पेज खोलें.
  2. अगर आपसे पूछा जाए, तो कोई प्रोजेक्ट चुनें या नया प्रोजेक्ट बनाएं.
  3. फ़ॉर्म भरें और सेव करें पर क्लिक करें.

सहमति वाले इस डायलॉग बॉक्स में दिखाया गया है कि जब अनुरोध में OAuth 2.0 और Google Drive के स्कोप का कॉम्बिनेशन मौजूद होता है, तो उपयोगकर्ता को क्या दिखता है. (इस सामान्य डायलॉग को Google OAuth 2.0 Playground का इस्तेमाल करके जनरेट किया गया था. इसलिए, इसमें ब्रैंडिंग की वह जानकारी शामिल नहीं है जो Cloud Console में सेट की जाएगी.)

सहमति वाले पेज का उदाहरण
पहली इमेज. सहमति वाले पेज का स्क्रीनशॉट

सेवा को ऐक्सेस करना

Google और तीसरे पक्ष, ऐसी लाइब्रेरी उपलब्ध कराते हैं जिनका इस्तेमाल करके, उपयोगकर्ताओं की पुष्टि करने और Google API का ऐक्सेस पाने से जुड़ी कई बातों का ध्यान रखा जा सकता है. उदाहरण के लिए, Google Identity Services और Google क्लाइंट लाइब्रेरी. ये कई प्लैटफ़ॉर्म के लिए उपलब्ध हैं.

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

उपयोगकर्ता की पुष्टि करना

उपयोगकर्ता की पुष्टि करने के लिए, आईडी टोकन पाना और उसकी पुष्टि करना ज़रूरी है. आईडी टोकन, OpenID Connect की एक स्टैंडर्ड सुविधा है. इसे इंटरनेट पर पहचान की पुष्टि करने के लिए डिज़ाइन किया गया है.

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

इस दस्तावेज़ में, उपयोगकर्ता की पुष्टि करने के लिए सर्वर फ़्लो को पूरा करने का तरीका बताया गया है. क्लाइंट-साइड पर टोकन को मैनेज करने और इस्तेमाल करने में सुरक्षा से जुड़े जोखिमों की वजह से, इंप्लिसिट फ़्लो का इस्तेमाल करना ज़्यादा मुश्किल होता है. अगर आपको इंप्लिसिट फ़्लो लागू करना है, तो हमारा सुझाव है कि आप Google Identity Services का इस्तेमाल करें.

सर्वर फ़्लो

पक्का करें कि आपने Cloud Console में अपना ऐप्लिकेशन सेट अप किया हो, ताकि वह इन प्रोटोकॉल का इस्तेमाल कर सके और आपके उपयोगकर्ताओं की पुष्टि कर सके. जब कोई उपयोगकर्ता Google से साइन इन करने की कोशिश करता है, तो आपको ये काम करने होंगे:

  1. फ़र्ज़ीवाड़े को रोकने के लिए स्टेट टोकन बनाना
  2. Google को पुष्टि करने का अनुरोध भेजना
  3. फ़र्ज़ीवाड़े से रोकने के लिए इस्तेमाल किए जाने वाले स्टेट टोकन की पुष्टि करना
  4. ऐक्सेस टोकन और आईडी टोकन के लिए code को एक्सचेंज करना
  5. आईडी टोकन से उपयोगकर्ता की जानकारी पाना
  6. उपयोगकर्ता की पुष्टि करना

1. फ़र्ज़ीवाड़े से रोकने वाला स्टेट टोकन बनाना

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

स्टेट टोकन के लिए, अच्छी क्वालिटी वाले रैंडम नंबर जनरेटर का इस्तेमाल करके बनाए गए 30 वर्णों के आस-पास की स्ट्रिंग का इस्तेमाल किया जा सकता है. इसके अलावा, अपने कुछ सेशन स्टेट वैरिएबल को ऐसी कुंजी से साइन करके जनरेट किए गए हैश का इस्तेमाल किया जा सकता है जिसे आपके बैकएंड पर गुप्त रखा जाता है.

यहां दिए गए कोड से, यूनीक सेशन टोकन जनरेट करने का तरीका पता चलता है.

PHP

इस उदाहरण का इस्तेमाल करने के लिए, आपको PHP के लिए Google APIs क्लाइंट लाइब्रेरी डाउनलोड करनी होगी.

// Create a state token to prevent request forgery.
// Store it in the session for later validation.
$state = bin2hex(random_bytes(128/8));
$app['session']->set('state', $state);
// Set the client ID, token state, and application name in the HTML while
// serving it.
return $app['twig']->render('index.html', array(
    'CLIENT_ID' => CLIENT_ID,
    'STATE' => $state,
    'APPLICATION_NAME' => APPLICATION_NAME
));

Java

इस उदाहरण का इस्तेमाल करने के लिए, आपको Java के लिए Google APIs क्लाइंट लाइब्रेरी डाउनलोड करनी होगी.

// Create a state token to prevent request forgery.
// Store it in the session for later validation.
String state = new BigInteger(130, new SecureRandom()).toString(32);
request.session().attribute("state", state);
// Read index.html into memory, and set the client ID,
// token state, and application name in the HTML before serving it.
return new Scanner(new File("index.html"), "UTF-8")
    .useDelimiter("\\A").next()
    .replaceAll("[{]{2}\\s*CLIENT_ID\\s*[}]{2}", CLIENT_ID)
    .replaceAll("[{]{2}\\s*STATE\\s*[}]{2}", state)
    .replaceAll("[{]{2}\\s*APPLICATION_NAME\\s*[}]{2}",
    APPLICATION_NAME);

Python

इस उदाहरण का इस्तेमाल करने के लिए, आपको Python के लिए Google APIs क्लाइंट लाइब्रेरी डाउनलोड करनी होगी.

# Create a state token to prevent request forgery.
# Store it in the session for later validation.
state = hashlib.sha256(os.urandom(1024)).hexdigest()
session['state'] = state
# Set the client ID, token state, and application name in the HTML while
# serving it.
response = make_response(
    render_template('index.html',
                    CLIENT_ID=CLIENT_ID,
                    STATE=state,
                    APPLICATION_NAME=APPLICATION_NAME))

2. Google को पुष्टि करने का अनुरोध भेजना

अगला चरण, सही यूआरआई पैरामीटर के साथ एचटीटीपीएस GET अनुरोध बनाना है. ध्यान दें कि इस प्रोसेस के सभी चरणों में, एचटीटीपी के बजाय एचटीटीपीएस का इस्तेमाल किया गया है. एचटीटीपी कनेक्शन अस्वीकार कर दिए जाते हैं. आपको authorization_endpoint मेटाडेटा वैल्यू का इस्तेमाल करके, खोज से जुड़े दस्तावेज़ से बेस यूआरआई को वापस पाना चाहिए. यहां दी गई जानकारी के हिसाब से, बेस यूआरआई https://accounts.google.com/o/oauth2/v2/auth है.

बुनियादी अनुरोध के लिए, इन पैरामीटर की जानकारी दें:

  • client_id, जिसे Cloud Console के क्लाइंट पेज से हासिल किया जाता है.
  • response_type, जो ऑथराइज़ेशन कोड फ़्लो के बुनियादी अनुरोध में code होना चाहिए. (ज़्यादा जानकारी के लिए, response_type पर जाएं.)
  • scope, जो बुनियादी अनुरोध में openid email होना चाहिए. (ज़्यादा जानकारी के लिए, scope पर जाएं.)
  • redirect_uri आपके सर्वर पर मौजूद एचटीटीपी एंडपॉइंट होना चाहिए. इस पर Google से जवाब मिलेगा. यह वैल्यू, OAuth 2.0 क्लाइंट के लिए अनुमति वाले रीडायरेक्ट यूआरआई में से किसी एक से पूरी तरह मेल खानी चाहिए. इसे आपने Cloud Console के क्रेडेंशियल पेज पर कॉन्फ़िगर किया था. अगर यह वैल्यू, अनुमति वाले यूआरआई से मेल नहीं खाती है, तो अनुरोध पूरा नहीं होगा और redirect_uri_mismatch गड़बड़ी दिखेगी.
  • state में, फ़र्ज़ीवाड़े को रोकने के लिए इस्तेमाल किए जाने वाले यूनीक सेशन टोकन की वैल्यू शामिल होनी चाहिए.साथ ही, इसमें ऐसी अन्य जानकारी भी शामिल होनी चाहिए जिसकी मदद से, उपयोगकर्ता के आपके ऐप्लिकेशन पर वापस आने पर कॉन्टेक्स्ट को वापस लाया जा सके. उदाहरण के लिए, शुरुआती यूआरएल. (ज़्यादा जानकारी के लिए, state पर जाएं.)
  • nonce आपके ऐप्लिकेशन से जनरेट की गई एक रैंडम वैल्यू है. यह वैल्यू मौजूद होने पर, रीप्ले प्रोटेक्शन की सुविधा चालू हो जाती है.
  • login_hint, उपयोगकर्ता का ईमेल पता या sub स्ट्रिंग हो सकती है. यह स्ट्रिंग, उपयोगकर्ता के Google आईडी के बराबर होती है. अगर आपने login_hint नहीं दिया है और उपयोगकर्ता ने लॉग इन किया हुआ है, तो सहमति वाली स्क्रीन में, उपयोगकर्ता के ईमेल पते को आपके ऐप्लिकेशन के साथ शेयर करने की अनुमति देने का अनुरोध शामिल होता है. (ज़्यादा जानकारी के लिए, login_hint पढ़ें.)
  • hd पैरामीटर का इस्तेमाल करके, Google Workspace या Cloud संगठन से जुड़े किसी डोमेन के उपयोगकर्ताओं के लिए OpenID Connect फ़्लो को ऑप्टिमाइज़ करें. इसके बारे में ज़्यादा जानने के लिए, hd पर जाएं.

यहां OpenID Connect ऑथेंटिकेशन यूआरआई का पूरा उदाहरण दिया गया है. इसमें पढ़ने में आसानी हो, इसके लिए लाइन ब्रेक और स्पेस शामिल किए गए हैं:

https://accounts.google.com/o/oauth2/v2/auth?
 response_type=code&
 client_id=424911365001.apps.googleusercontent.com&
 scope=openid%20email&
 redirect_uri=https%3A//developers.google.com/oauthplayground&
 state=security_token%3D138r5719ru3e1%26url%3Dhttps%3A%2F%2Foauth2-login-demo.example.com%2FmyHome&
 login_hint=jsmith@example.com&
 nonce=0394852-3190485-2490358&
 hd=example.com

अगर आपका ऐप्लिकेशन, उपयोगकर्ताओं से उनकी कोई नई जानकारी मांगता है या उनके खाते का ऐक्सेस मांगता है, तो उन्हें सहमति देनी होगी. ऐसा तब भी करना होगा, जब उन्होंने पहले इस ऐक्सेस को मंज़ूरी न दी हो.

3. फ़र्ज़ीवाड़े को रोकने के लिए इस्तेमाल किए जाने वाले टोकन की पुष्टि करना

जवाब, उस redirect_uri पर भेजा जाता है जिसे आपने अनुरोध में बताया है. सभी जवाब क्वेरी स्ट्रिंग में दिखाए जाते हैं:

https://developers.google.com/oauthplayground?state=security_token%3D138r5719ru3e1%26url%3Dhttps%3A%2F%2Foa2cb.example.com%2FmyHome&code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7&scope=openid%20email%20https://www.googleapis.com/auth/userinfo.email

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

यहां दिए गए कोड से, पहले चरण में बनाए गए सेशन टोकन की पुष्टि करने का तरीका पता चलता है:

PHP

इस उदाहरण का इस्तेमाल करने के लिए, आपको PHP के लिए Google APIs क्लाइंट लाइब्रेरी डाउनलोड करनी होगी.

// Ensure that there is no request forgery going on, and that the user
// sending us this connect request is the user that was supposed to.
if ($request->get('state') != ($app['session']->get('state'))) {
  return new Response('Invalid state parameter', 401);
}

Java

इस उदाहरण का इस्तेमाल करने के लिए, आपको Java के लिए Google APIs क्लाइंट लाइब्रेरी डाउनलोड करनी होगी.

// Ensure that there is no request forgery going on, and that the user
// sending us this connect request is the user that was supposed to.
if (!request.queryParams("state").equals(
    request.session().attribute("state"))) {
  response.status(401);
  return GSON.toJson("Invalid state parameter.");
}

Python

इस उदाहरण का इस्तेमाल करने के लिए, आपको Python के लिए Google APIs क्लाइंट लाइब्रेरी डाउनलोड करनी होगी.

# Ensure that the request is not a forgery and that the user sending
# this connect request is the expected user.
if request.args.get('state', '') != session['state']:
  response = make_response(json.dumps('Invalid state parameter.'), 401)
  response.headers['Content-Type'] = 'application/json'
  return response

4. ऐक्सेस टोकन और आईडी टोकन के लिए code को एक्सचेंज करना

जवाब में code पैरामीटर शामिल होता है. यह एक बार इस्तेमाल किया जा सकने वाला ऑथराइज़ेशन कोड होता है. आपका सर्वर, इसे ऐक्सेस टोकन और आईडी टोकन के लिए बदल सकता है. आपका सर्वर, एचटीटीपीएस POST अनुरोध भेजकर यह एक्सचेंज करता है. POST अनुरोध, टोकन एंडपॉइंट को भेजा जाता है. आपको token_endpoint मेटाडेटा वैल्यू का इस्तेमाल करके, खोज से जुड़े दस्तावेज़ से इसे वापस पाना चाहिए. यहां दी गई जानकारी में, एंडपॉइंट को माना गया है.https://oauth2.googleapis.com/token अनुरोध में, POST बॉडी में ये पैरामीटर शामिल होने चाहिए:

फ़ील्ड
code शुरुआती अनुरोध से मिला ऑथराइज़ेशन कोड.
client_id Cloud Console के क्लाइंट पेज से मिला क्लाइंट आईडी. इसके बारे में OAuth 2.0 क्रेडेंशियल पाना लेख में बताया गया है.
client_secret क्लाइंट सीक्रेट, जिसे Cloud Console के क्लाइंट पेज से हासिल किया जाता है. इसके बारे में OAuth 2.0 क्रेडेंशियल पाना लेख में बताया गया है.
redirect_uri Cloud Console के क्लाइंट पेज में दिए गए client_id के लिए, अनुमति वाला रीडायरेक्ट यूआरआई. इसके बारे में रीडायरेक्ट यूआरआई सेट करना लेख में बताया गया है.
grant_type इस फ़ील्ड में authorization_code वैल्यू होनी चाहिए. यह वैल्यू, OAuth 2.0 से जुड़ी शर्तों के मुताबिक होनी चाहिए.

अनुरोध कुछ इस तरह दिख सकता है:

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//developers.google.com/oauthplayground&
grant_type=authorization_code

इस अनुरोध के लिए मिले सही रिस्पॉन्स में, JSON ऐरे में ये फ़ील्ड शामिल होते हैं:

फ़ील्ड
access_token यह एक ऐसा टोकन होता है जिसे Google API को भेजा जा सकता है.
expires_in ऐक्सेस टोकन की बची हुई लाइफ़टाइम, सेकंड में.
id_token यह एक JWT होता है. इसमें उपयोगकर्ता की पहचान से जुड़ी जानकारी होती है. इस पर Google के डिजिटल हस्ताक्षर होते हैं.
scope access_token से दिए गए ऐक्सेस के स्कोप. इन्हें केस-सेंसिटिव स्ट्रिंग की सूची के तौर पर दिखाया जाता है. इनके बीच में खाली जगह का इस्तेमाल किया जाता है.
token_type इससे, वापस भेजे गए टोकन के टाइप की पहचान होती है. इस समय, इस फ़ील्ड की वैल्यू हमेशा Bearer होती है.
refresh_token (ज़रूरी नहीं)

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

5. आईडी टोकन से उपयोगकर्ता की जानकारी पाना

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

ज़्यादातर एपीआई लाइब्रेरी, पुष्टि करने की प्रोसेस को base64url-encoded वैल्यू को डिकोड करने और JSON को पार्स करने के साथ जोड़ देती हैं. इसलिए, आईडी टोकन में मौजूद दावों को ऐक्सेस करते समय, टोकन की पुष्टि हो जाएगी.

आईडी टोकन का पेलोड

आईडी टोकन, JSON ऑब्जेक्ट होता है. इसमें नाम/वैल्यू पेयर का सेट होता है. यहां एक उदाहरण दिया गया है. इसे पढ़ने में आसानी हो, इसके लिए फ़ॉर्मैट किया गया है:

{
  "iss": "https://accounts.google.com",
  "azp": "1234987819200.apps.googleusercontent.com",
  "aud": "1234987819200.apps.googleusercontent.com",
  "sub": "10769150350006150715113082367",
  "at_hash": "HK6E_P6Dh8Y93mRNtsDB1Q",
  "hd": "example.com",
  "email": "jsmith@example.com",
  "email_verified": "true",
  "iat": 1353601026,
  "exp": 1353604926,
  "nonce": "0394852-3190485-2490358"
}

Google आईडी टोकन में ये फ़ील्ड शामिल हो सकते हैं. इन्हें दावे कहा जाता है:

दावा करें दिया गया ब्यौरा
aud हमेशा यह आईडी टोकन जिस ऑडियंस के लिए है. यह आपके ऐप्लिकेशन के OAuth 2.0 क्लाइंट आईडी में से एक होना चाहिए.
exp हमेशा समयसीमा खत्म होने का वह समय जिसके बाद आईडी टोकन स्वीकार नहीं किया जाना चाहिए. इसे यूनिक्स इपोक टाइम (पूर्णांक सेकंड) में दिखाया जाता है.
iat हमेशा आईडी टोकन जारी करने का समय. इसे यूनिक्स इपोक टाइम (पूर्णांक सेकंड) में दिखाया जाता है.
iss हमेशा जवाब देने वाले के लिए, जारी करने वाले का आइडेंटिफ़ायर. Google आईडी टोकन के लिए, हमेशा https://accounts.google.com या accounts.google.com का इस्तेमाल करें.
sub हमेशा यह उपयोगकर्ता के लिए एक आइडेंटिफ़ायर होता है. यह सभी Google खातों में यूनीक होता है और इसे कभी भी फिर से इस्तेमाल नहीं किया जाता. किसी Google खाते में समय-समय पर कई ईमेल पते हो सकते हैं, लेकिन sub वैल्यू कभी नहीं बदलती. अपने ऐप्लिकेशन में sub का इस्तेमाल करें. इसे उपयोगकर्ता के लिए यूनीक-आइडेंटिफ़ायर कुंजी के तौर पर इस्तेमाल करें. इसमें ज़्यादा से ज़्यादा 255 केस-सेंसिटिव (बड़े और छोटे अक्षरों में अंतर) ASCII वर्ण इस्तेमाल किए जा सकते हैं.
amr यह स्ट्रिंग का JSON कलेक्शन होता है. इससे, Google खाते में साइन इन करने के लिए इस्तेमाल किए गए पुष्टि करने के तरीकों की पहचान की जाती है. अगर यह मौजूद है, तो इसमें इनमें से एक या ज़्यादा संभावित [IANA.AMR] वैल्यू शामिल होती हैं:
  • hwk हार्डवेयर बटन का इस्तेमाल किया गया था
  • mfa कई चरणों में पुष्टि करने की प्रोसेस पूरी हो गई है
  • pwd पासवर्ड का इस्तेमाल किया गया
  • sms पुष्टि करने के लिए एसएमएस का इस्तेमाल किया गया था
  • swk पासकी जैसी सॉफ़्टवेयर कुंजी का इस्तेमाल किया गया था
  • tel पुष्टि करने के लिए फ़ोन कॉल का इस्तेमाल किया गया था
यह सिर्फ़ तब मौजूद होता है, जब पुष्टि करने के अनुरोध में amr का दावा शामिल हो और सेटिंग में चालू हो.
auth_time उपयोगकर्ता की पुष्टि होने का समय. यह एक JSON नंबर होता है. यह यूनिक्स इपोक (1 जनवरी, 1970, 00:00:00 यूटीसी) के बाद से बीते हुए सेकंड की संख्या को दिखाता है. यह तब मिलता है, जब auth_time दावा, पुष्टि करने के अनुरोध में शामिल किया गया हो और सेटिंग में चालू किया गया हो.
at_hash ऐक्सेस टोकन हैश. इससे यह पुष्टि होती है कि ऐक्सेस टोकन, आइडेंटिटी टोकन से जुड़ा है. अगर सर्वर फ़्लो में access_token वैल्यू के साथ आईडी टोकन जारी किया जाता है, तो यह दावा हमेशा शामिल होता है. इस दावे का इस्तेमाल, किसी दूसरी साइट से किए गए अनुरोध फ़र्जरी हमलों से सुरक्षा के लिए, किसी अन्य तरीके के तौर पर किया जा सकता है. हालांकि, अगर आपने पहला चरण और तीसरा चरण पूरा कर लिया है, तो ऐक्सेस टोकन की पुष्टि करना ज़रूरी नहीं है.
azp यह अनुमति पा चुके प्रज़ेंटर का client_id होता है. इस दावे की ज़रूरत सिर्फ़ तब होती है, जब आईडी टोकन का अनुरोध करने वाली पार्टी, आईडी टोकन के ऑडियंस से अलग हो. ऐसा Google के हाइब्रिड ऐप्लिकेशन के मामले में हो सकता है. इनमें वेब ऐप्लिकेशन और Android ऐप्लिकेशन का OAuth 2.0 client_id अलग-अलग होता है, लेकिन वे एक ही Google APIs प्रोजेक्ट को शेयर करते हैं.
email उपयोगकर्ता का ईमेल पता. यह जानकारी सिर्फ़ तब मिलती है, जब आपने अपने अनुरोध में email स्कोप को शामिल किया हो. ऐसा हो सकता है कि इस दावे की वैल्यू, इस खाते के लिए यूनीक न हो. साथ ही, यह समय के साथ बदल सकती है. इसलिए, आपको इस वैल्यू का इस्तेमाल मुख्य आइडेंटिफ़ायर के तौर पर नहीं करना चाहिए, ताकि इसे अपने उपयोगकर्ता रिकॉर्ड से लिंक किया जा सके. Google Workspace या Cloud संगठनों के उपयोगकर्ताओं की पहचान करने के लिए, email दावे के डोमेन पर भी भरोसा नहीं किया जा सकता. इसके बजाय, email दावे का इस्तेमाल करें.hd
email_verified अगर उपयोगकर्ता के ईमेल पते की पुष्टि हो गई है, तो यह वैल्यू 'सही' होगी. अगर पुष्टि नहीं हुई है, तो यह वैल्यू 'गलत' होगी.
family_name उपयोगकर्ता का उपनाम. name दावा मौजूद होने पर, यह एट्रिब्यूट सबमिट किया जा सकता है.
given_name उपयोगकर्ता का नाम. name दावा मौजूद होने पर, यह एट्रिब्यूट सबमिट किया जा सकता है.
hd यह उपयोगकर्ता के Google Workspace या Cloud संगठन से जुड़ा डोमेन होता है. यह सिर्फ़ तब दिया जाता है, जब उपयोगकर्ता किसी Google Cloud संगठन से जुड़ा हो. आपको इस दावे की पुष्टि करनी होगी, ताकि किसी संसाधन का ऐक्सेस सिर्फ़ कुछ डोमेन के सदस्यों तक सीमित किया जा सके. इस दावे के मौजूद न होने का मतलब है कि खाता, Google के होस्ट किए गए किसी डोमेन से नहीं जुड़ा है.
locale उपयोगकर्ता की स्थान-भाषा, जिसे BCP 47 भाषा टैग से दिखाया जाता है. name दावा मौजूद होने पर, यह जानकारी दी जा सकती है.
name उपयोगकर्ता का पूरा नाम, जिसे दिखाया जा सकता है. यह एट्रिब्यूट तब सबमिट किया जा सकता है, जब:
  • अनुरोध के स्कोप में "profile" स्ट्रिंग शामिल है
  • यह आईडी टोकन, टोकन रीफ़्रेश करने पर मिलता है

name के दावे मौजूद होने पर, इनका इस्तेमाल करके अपने ऐप्लिकेशन के उपयोगकर्ता रिकॉर्ड अपडेट किए जा सकते हैं. ध्यान दें कि इस दावे के मौजूद होने की कभी गारंटी नहीं दी जाती.

nonce पुष्टि करने के अनुरोध में, आपके ऐप्लिकेशन से दी गई nonce की वैल्यू. आपको इस वैल्यू को सिर्फ़ एक बार दिखाकर, रीप्ले अटैक से बचना चाहिए.
picture उपयोगकर्ता की प्रोफ़ाइल फ़ोटो का यूआरएल. यह एट्रिब्यूट तब सबमिट किया जा सकता है, जब:
  • अनुरोध के स्कोप में "profile" स्ट्रिंग शामिल है
  • यह आईडी टोकन, टोकन रीफ़्रेश करने पर मिलता है

picture के दावे मौजूद होने पर, उनका इस्तेमाल करके अपने ऐप्लिकेशन के उपयोगकर्ता रिकॉर्ड अपडेट किए जा सकते हैं. ध्यान दें कि इस दावे के मौजूद होने की कभी गारंटी नहीं दी जाती.

profile उपयोगकर्ता की प्रोफ़ाइल पेज का यूआरएल. यह एट्रिब्यूट तब सबमिट किया जा सकता है, जब:
  • अनुरोध के स्कोप में "profile" स्ट्रिंग शामिल है
  • यह आईडी टोकन, टोकन रीफ़्रेश करने पर मिलता है

profile के दावे मौजूद होने पर, उनका इस्तेमाल करके अपने ऐप्लिकेशन के उपयोगकर्ता रिकॉर्ड अपडेट किए जा सकते हैं. ध्यान दें कि इस दावे के मौजूद होने की कभी गारंटी नहीं दी जाती.

6. उपयोगकर्ता की पुष्टि करना

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

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

उन्नत विषय

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

Google के अन्य एपीआई का ऐक्सेस

पुष्टि करने के लिए OAuth 2.0 का इस्तेमाल करने का एक फ़ायदा यह है कि आपका ऐप्लिकेशन, उपयोगकर्ता की पुष्टि करने के साथ-साथ, उपयोगकर्ता की ओर से Google APIs (जैसे, YouTube, Google Drive, Calendar या Contacts) का इस्तेमाल करने की अनुमति पा सकता है. इसके लिए, Google को भेजे गए पुष्टि करने के अनुरोध में, आपको जिन अन्य स्कोप की ज़रूरत है उन्हें शामिल करें. उदाहरण के लिए, पुष्टि करने के अनुरोध में उपयोगकर्ता के उम्र समूह को जोड़ने के लिए, openid email https://www.googleapis.com/auth/profile.agerange.read का स्कोप पैरामीटर पास करें. उपयोगकर्ता को सहमति स्क्रीन पर सही तरीके से सूचना दी जाती है. Google से मिलने वाला ऐक्सेस टोकन, आपके ऐप्लिकेशन को उन सभी एपीआई को ऐक्सेस करने की अनुमति देगा जिनके लिए आपने ऐक्सेस का अनुरोध किया था और जिन्हें अनुमति दी गई थी.

रीफ़्रेश टोकन

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

इन बातों पर ध्यान दें:

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

ज़्यादा जानकारी के लिए, ऐक्सेस टोकन रीफ़्रेश करना (ऑफ़लाइन ऐक्सेस) लेख पढ़ें.

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

prompt पैरामीटर के बारे में ज़्यादा जानने के लिए, पुष्टि करने के यूआरआई पैरामीटर टेबल में prompt देखें.

पुष्टि करने के यूआरआई पैरामीटर

यहां दी गई टेबल में, Google के OAuth 2.0 ऑथेंटिकेशन एपीआई के ज़रिए स्वीकार किए गए पैरामीटर के बारे में ज़्यादा जानकारी दी गई है.

पैरामीटर ज़रूरी है ब्यौरा
client_id (ज़रूरी है) क्लाइंट आईडी स्ट्रिंग, जिसे Cloud Console के क्लाइंट पेज से हासिल किया जाता है. इसके बारे में OAuth 2.0 क्रेडेंशियल पाना लेख में बताया गया है.
nonce (ज़रूरी है) आपके ऐप्लिकेशन से जनरेट की गई कोई रैंडम वैल्यू, जो रीप्ले सुरक्षा को चालू करती है.
response_type (ज़रूरी है) अगर वैल्यू code है, तो बेसिक ऑथराइज़ेशन कोड फ़्लो लॉन्च करता है. इसके लिए, टोकन एंडपॉइंट को POST की ज़रूरत होती है, ताकि टोकन मिल सकें. अगर वैल्यू token id_token या id_token token है, तो इंप्लिसिट फ़्लो लॉन्च करता है. इसके लिए, रीडायरेक्ट यूआरआई पर JavaScript का इस्तेमाल करना ज़रूरी है, ताकि यूआरआई #fragment आइडेंटिफ़ायर से टोकन वापस पाए जा सकें.
redirect_uri (ज़रूरी है) इससे यह तय होता है कि रिस्पॉन्स कहां भेजा जाएगा. इस पैरामीटर की वैल्यू, Cloud Console के क्लाइंट पेज में सेट की गई, रीडायरेक्ट करने की अनुमति वाली वैल्यू में से किसी एक से पूरी तरह मेल खानी चाहिए. इसमें एचटीटीपी या एचटीटीपीएस स्कीम, केस, और आखिर में '/' (अगर कोई है) शामिल है.
scope (ज़रूरी है)

स्कोप पैरामीटर की वैल्यू openid से शुरू होनी चाहिए. इसके बाद, इसमें profile वैल्यू, email वैल्यू या दोनों शामिल होनी चाहिए.

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

अगर email स्कोप वैल्यू मौजूद है, तो आईडी टोकन में email और email_verified दावे शामिल होते हैं.

OpenID से जुड़े इन स्कोप के अलावा, स्कोप आर्ग्युमेंट में स्कोप की अन्य वैल्यू भी शामिल की जा सकती हैं. स्कोप की सभी वैल्यू को स्पेस से अलग किया जाना चाहिए. उदाहरण के लिए, अगर आपको किसी उपयोगकर्ता के Google Drive में मौजूद हर फ़ाइल का ऐक्सेस चाहिए, तो आपका स्कोप पैरामीटर openid profile email https://www.googleapis.com/auth/drive.file हो सकता है.

उपलब्ध स्कोप के बारे में जानकारी पाने के लिए, Google APIs के लिए OAuth 2.0 के स्कोप देखें. इसके अलावा, उस Google API का दस्तावेज़ देखें जिसका आपको इस्तेमाल करना है.

state (ज़रूरी नहीं, लेकिन हमारा सुझाव है कि आप इसे इस्तेमाल करें)

यह एक ओपेक स्ट्रिंग है, जो प्रोटोकॉल में राउंड-ट्रिप की जाती है. इसका मतलब है कि इसे बेसिक फ़्लो में यूआरआई पैरामीटर के तौर पर दिखाया जाता है. साथ ही, इसे इंप्लिसिट फ़्लो में यूआरआई #fragment आइडेंटिफ़ायर के तौर पर दिखाया जाता है.

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

access_type (ज़रूरी नहीं) offline और online को वैल्यू के तौर पर इस्तेमाल किया जा सकता है. इसका असर ऑफ़लाइन ऐक्सेस में बताया गया है. अगर ऐक्सेस टोकन का अनुरोध किया जा रहा है, तो क्लाइंट को रीफ़्रेश टोकन तब तक नहीं मिलता, जब तक कि offline की वैल्यू तय नहीं की जाती.
claims (ज़रूरी नहीं) claims पैरामीटर का इस्तेमाल, एक या उससे ज़्यादा वैकल्पिक फ़ील्ड तय करने के लिए किया जाता है. इन फ़ील्ड को userinfo एंडपॉइंट या पुष्टि करने के अनुरोध वाले आईडी टोकन के जवाब के टाइप में शामिल किया जाता है. यह वैल्यू एक JSON ऑब्जेक्ट है. इसमें रिस्पॉन्स टाइप और अनुरोध किए गए दावे शामिल होते हैं. Google के सर्वर, दावे के इन अनुरोधों को स्वीकार करते हैं:
दावे के अनुरोध
amr उस तरीके का अनुरोध करें जिसका इस्तेमाल उपयोगकर्ता की पुष्टि करने के लिए पिछली बार किया गया था. आईडी टोकन के जवाब में amr को फ़ील्ड के तौर पर वापस पाने के लिए, claims अनुरोध पैरामीटर शामिल करें: claims={"id_token":{"amr":{"essential":true}}} इसे सेटिंग में चालू करना ज़रूरी है.
auth_time यह कुकी, उस समय का अनुरोध करती है जब उपयोगकर्ता की पुष्टि आखिरी बार की गई थी. आईडी टोकन के जवाब में auth_time को फ़ील्ड के तौर पर वापस पाने के लिए, claims अनुरोध पैरामीटर शामिल करें: claims={"id_token":{"auth_time":{"essential":true}}} इसे सेटिंग में चालू करना ज़रूरी है.
display (ज़रूरी नहीं) यह एक ASCII स्ट्रिंग वैल्यू है. इससे यह तय किया जाता है कि ऑथराइज़ेशन सर्वर, पुष्टि और सहमति लेने के लिए यूज़र इंटरफ़ेस (यूआई) वाले पेज कैसे दिखाता है. यहां दी गई वैल्यू, Google के सर्वर के लिए तय की गई हैं और इन्हें स्वीकार किया जाता है. हालांकि, इनका प्रोटोकॉल फ़्लो के व्यवहार पर कोई असर नहीं पड़ता: page, popup, touch, और wap.
hd (ज़रूरी नहीं)

Google Cloud संगठन के मालिकाना हक वाले खातों के लिए, लॉगिन प्रोसेस को आसान बनाएं. Google Cloud संगठन के डोमेन (उदाहरण के लिए, mycollege.edu) को शामिल करके, यह बताया जा सकता है कि खाता चुनने वाले यूज़र इंटरफ़ेस (यूआई) को उस डोमेन के खातों के लिए ऑप्टिमाइज़ किया जाना चाहिए. अगर आपको सिर्फ़ एक Google Cloud संगठन के डोमेन के बजाय, सामान्य तौर पर Google Cloud संगठन के खातों के लिए ऑप्टिमाइज़ करना है, तो ऐस्टरिक (*) की वैल्यू सेट करें: *.hd=*

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

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

ध्यान दें कि इंस्टॉल किए गए ऐप्लिकेशन के फ़्लो के साथ, इंक्रीमेंटल ऑथराइज़ेशन नहीं किया जा सकता.

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

    अनुमति देने वाला सर्वर, पुष्टि करने या उपयोगकर्ता की सहमति लेने वाली कोई स्क्रीन नहीं दिखाता. अगर उपयोगकर्ता की पुष्टि पहले से नहीं हुई है और उसने अनुरोध किए गए स्कोप के लिए पहले से सहमति नहीं दी है, तो सर्वर एक गड़बड़ी दिखाएगा. none का इस्तेमाल करके, पुष्टि और/या सहमति की मौजूदा स्थिति की जांच की जा सकती है.

  • consent

    अनुमति देने वाला सर्वर, क्लाइंट को जानकारी वापस भेजने से पहले उपयोगकर्ता से सहमति मांगता है.

  • select_account

    अनुमति देने वाला सर्वर, उपयोगकर्ता को कोई खाता चुनने के लिए कहता है. इससे, अनुमति देने वाले सर्वर पर एक से ज़्यादा खाते रखने वाला उपयोगकर्ता, उन खातों में से किसी एक को चुन सकता है जिनके लिए उसके मौजूदा सेशन चालू हैं.

अगर कोई वैल्यू तय नहीं की गई है और उपयोगकर्ता ने पहले ऐक्सेस करने की अनुमति नहीं दी है, तो उपयोगकर्ता को सहमति वाली स्क्रीन दिखाई जाती है.

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

आईडी टोकन की पुष्टि करना

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

यहां कुछ सामान्य स्थितियां दी गई हैं, जिनमें आपको अपने सर्वर पर आईडी टोकन भेजने पड़ सकते हैं:

  • ऐसे अनुरोधों के साथ आईडी टोकन भेजना जिनकी पुष्टि करना ज़रूरी है. आईडी टोकन से आपको यह पता चलता है कि अनुरोध किस उपयोगकर्ता ने किया है और किस क्लाइंट को यह आईडी टोकन दिया गया था.

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

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

आईडी टोकन की पुष्टि करने के लिए, कई चरण पूरे करने होते हैं:

  1. पुष्टि करें कि आईडी टोकन पर, जारी करने वाले ने सही तरीके से हस्ताक्षर किए हों. Google से जारी किए गए टोकन पर हस्ताक्षर किए जाते हैं. इसके लिए, खोज से जुड़े दस्तावेज़ के jwks_uri मेटाडेटा वैल्यू में दिए गए यूआरआई पर मौजूद किसी एक सर्टिफ़िकेट का इस्तेमाल किया जाता है.
  2. पुष्टि करें कि आईडी टोकन में मौजूद iss दावे की वैल्यू, https://accounts.google.com या accounts.google.com के बराबर हो.
  3. पुष्टि करें कि आईडी टोकन में मौजूद aud दावे की वैल्यू, आपके ऐप्लिकेशन के क्लाइंट आईडी के बराबर हो.
  4. पुष्टि करें कि आईडी टोकन की समयसीमा खत्म होने का समय (exp दावा) खत्म नहीं हुआ है.
  5. अगर आपने अनुरोध में hd पैरामीटर की वैल्यू दी है, तो पुष्टि करें कि आईडी टोकन में hd दावा मौजूद हो. यह दावा, Google Cloud संगठन से जुड़े किसी ऐसे डोमेन से मेल खाता हो जिसे स्वीकार किया गया हो.

दूसरे से पांचवें चरण में, सिर्फ़ स्ट्रिंग और तारीख की तुलना की जाती है. यह काफ़ी आसान है. इसलिए, हम यहां इसके बारे में ज़्यादा जानकारी नहीं देंगे.

पहला चरण ज़्यादा मुश्किल होता है. इसमें क्रिप्टोग्राफ़िक सिग्नेचर की जांच की जाती है. डीबग करने के लिए, Google के tokeninfo एंडपॉइंट का इस्तेमाल किया जा सकता है. इससे, अपने सर्वर या डिवाइस पर लागू की गई लोकल प्रोसेसिंग की तुलना की जा सकती है. मान लें कि आपके आईडी टोकन की वैल्यू XYZ123 है. इसके बाद, यूआरआई https://oauth2.googleapis.com/tokeninfo?id_token=XYZ123 को डीरेफ़रेंस किया जाएगा. अगर टोकन का हस्ताक्षर मान्य है, तो रिस्पॉन्स में JWT पेलोड, डिकोड किए गए JSON ऑब्जेक्ट के तौर पर दिखेगा.

tokeninfo एंडपॉइंट, डीबग करने के लिए काम का है. हालांकि, प्रोडक्शन के लिए, Google के सार्वजनिक पासकोड को keys एंडपॉइंट से वापस पाएं और पुष्टि की प्रोसेस को स्थानीय तौर पर पूरा करें. आपको jwks_uri मेटाडेटा वैल्यू का इस्तेमाल करके, खोज से जुड़े दस्तावेज़ से कुंजियों का यूआरआई वापस पाना चाहिए. डीबग करने वाले एंडपॉइंट के अनुरोधों को थ्रॉटल किया जा सकता है. इसके अलावा, इनमें कुछ समय के लिए गड़बड़ियां भी हो सकती हैं.

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

उपयोगकर्ता की प्रोफ़ाइल की जानकारी पाना

उपयोगकर्ता की प्रोफ़ाइल के बारे में ज़्यादा जानकारी पाने के लिए, ऐक्सेस टोकन का इस्तेमाल किया जा सकता है. यह टोकन, आपके ऐप्लिकेशन को पुष्टि करने की प्रोसेस के दौरान मिलता है. साथ ही, OpenID Connect स्टैंडर्ड का इस्तेमाल किया जा सकता है:

  1. OpenID के साथ काम करने के लिए, आपको पुष्टि करने के अनुरोध में, openid profile स्कोप की वैल्यू शामिल करनी होंगी.

    अगर आपको उपयोगकर्ता का ईमेल पता शामिल करना है, तो email के तौर पर स्कोप की कोई अन्य वैल्यू तय की जा सकती है. profile और email, दोनों को तय करने के लिए, अपने पुष्टि करने के अनुरोध URI में यह पैरामीटर शामिल करें:

    scope=openid%20profile%20email
  2. अपने ऐक्सेस टोकन को ऑथराइज़ेशन हेडर में जोड़ें. इसके बाद, userinfo एंडपॉइंट पर एचटीटीपीएस GET अनुरोध करें. आपको यह एंडपॉइंट, खोज से जुड़े दस्तावेज़ से userinfo_endpoint मेटाडेटा वैल्यू का इस्तेमाल करके वापस पाना चाहिए. userinfo रिस्पॉन्स में उपयोगकर्ता के बारे में जानकारी शामिल होती है. इसके बारे में OpenID Connect Standard Claims में बताया गया है. साथ ही, इसमें खोज से जुड़े दस्तावेज़ की claims_supported मेटाडेटा वैल्यू भी शामिल होती है. उपयोगकर्ता या उनके संगठन, कुछ फ़ील्ड की जानकारी दे सकते हैं या नहीं भी दे सकते हैं. इसलिए, हो सकता है कि आपको ऐक्सेस के लिए अनुमति वाले स्कोप के हर फ़ील्ड की जानकारी न मिले.

खोज से जुड़ा दस्तावेज़

OpenID Connect प्रोटोकॉल में, उपयोगकर्ताओं की पुष्टि करने के लिए कई एंडपॉइंट का इस्तेमाल करना ज़रूरी होता है. साथ ही, टोकन, उपयोगकर्ता की जानकारी, और सार्वजनिक कुंजियों जैसे संसाधनों का अनुरोध करने के लिए भी इनका इस्तेमाल करना ज़रूरी होता है.

लागू करने की प्रोसेस को आसान बनाने और ज़्यादा सुविधा देने के लिए, OpenID Connect में "खोज से जुड़ा दस्तावेज़" का इस्तेमाल किया जा सकता है. यह एक JSON दस्तावेज़ होता है. यह एक जानी-पहचानी जगह पर मौजूद होता है. इसमें की/वैल्यू पेयर होते हैं. इनसे OpenID Connect सेवा देने वाली कंपनी के कॉन्फ़िगरेशन के बारे में जानकारी मिलती है. इसमें अनुमति, टोकन, रद्द करने, उपयोगकर्ता की जानकारी, और सार्वजनिक पासकोड वाले एंडपॉइंट के यूआरआई शामिल होते हैं. Google की OpenID Connect सेवा के लिए खोज से जुड़ा दस्तावेज़ यहां से पाया जा सकता है:

https://accounts.google.com/.well-known/openid-configuration

Google की OpenID Connect सेवाओं का इस्तेमाल करने के लिए, आपको अपने ऐप्लिकेशन में डिस्कवरी-दस्तावेज़ यूआरआई (https://accounts.google.com/.well-known/openid-configuration) को हार्ड-कोड करना होगा. आपका ऐप्लिकेशन, दस्तावेज़ को फ़ेच करता है, जवाब में कैश मेमोरी से जुड़े नियमों को लागू करता है, और फिर ज़रूरत के मुताबिक उससे एंडपॉइंट यूआरआई को वापस पाता है. उदाहरण के लिए, किसी उपयोगकर्ता की पुष्टि करने के लिए, आपका कोड authorization_endpoint मेटाडेटा वैल्यू (नीचे दिए गए उदाहरण में https://accounts.google.com/o/oauth2/v2/auth) को Google को भेजे गए पुष्टि करने के अनुरोधों के लिए, बेस यूआरआई के तौर पर वापस पाएगा.

यहां ऐसे दस्तावेज़ का एक उदाहरण दिया गया है. फ़ील्ड के नाम, OpenID Connect Discovery 1.0 में दिए गए हैं (इनके मतलब जानने के लिए, उस दस्तावेज़ को देखें). वैल्यू सिर्फ़ उदाहरण के तौर पर दी गई हैं और इनमें बदलाव हो सकता है. हालांकि, इन्हें Google के खोज से जुड़े दस्तावेज़ के हाल ही के वर्शन से कॉपी किया गया है:

{
  "issuer": "https://accounts.google.com",
  "authorization_endpoint": "https://accounts.google.com/o/oauth2/v2/auth",
  "device_authorization_endpoint": "https://oauth2.googleapis.com/device/code",
  "token_endpoint": "https://oauth2.googleapis.com/token",
  "userinfo_endpoint": "https://openidconnect.googleapis.com/v1/userinfo",
  "revocation_endpoint": "https://oauth2.googleapis.com/revoke",
  "jwks_uri": "https://www.googleapis.com/oauth2/v3/certs",
  "response_types_supported": [
    "code",
    "token",
    "id_token",
    "code token",
    "code id_token",
    "token id_token",
    "code token id_token",
    "none"
  ],
  "subject_types_supported": [
    "public"
  ],
  "id_token_signing_alg_values_supported": [
    "RS256"
  ],
  "scopes_supported": [
    "openid",
    "email",
    "profile"
  ],
  "token_endpoint_auth_methods_supported": [
    "client_secret_post",
    "client_secret_basic"
  ],
  "claims_supported": [
    "aud",
    "email",
    "email_verified",
    "exp",
    "family_name",
    "given_name",
    "iat",
    "iss",
    "locale",
    "name",
    "picture",
    "sub"
  ],
  "code_challenge_methods_supported": [
    "plain",
    "S256"
  ]
}

डिस्कवरी दस्तावेज़ से वैल्यू को कैश मेमोरी में सेव करके, एचटीटीपी राउंड-ट्रिप से बचा जा सकता है. स्टैंडर्ड एचटीटीपी कैश मेमोरी में सेव करने वाले हेडर का इस्तेमाल किया जाता है. इनका पालन किया जाना चाहिए.

क्लाइंट लाइब्रेरी

यहां दी गई क्लाइंट लाइब्रेरी, लोकप्रिय फ़्रेमवर्क के साथ इंटिग्रेट करके, OAuth 2.0 को लागू करने की प्रोसेस को आसान बनाती हैं:

OpenID Connect के नियमों का पालन

Google का OAuth 2.0 ऑथेंटिकेशन सिस्टम, OpenID Connect Core स्पेसिफ़िकेशन की ज़रूरी सुविधाओं के साथ काम करता है. OpenID Connect के साथ काम करने के लिए डिज़ाइन किया गया कोई भी क्लाइंट, इस सेवा के साथ इंटरऑपरेट करना चाहिए. हालांकि, OpenID अनुरोध ऑब्जेक्ट को छोड़कर.