चेतावनी: यह डेटा Google उपयोगकर्ता डेटा नीति के तहत दिया जाता है. कृपया समीक्षा करें और नीति का पालन करें. ऐसा न करने पर, प्रोजेक्ट या खाता निलंबित हो सकता है.

Google पहचान सेवाओं पर माइग्रेट करें

खास जानकारी

Google API पर कॉल करने के लिए हर उपयोगकर्ता का ऐक्सेस टोकन पाने के लिए, Google कई JavaScript लाइब्रेरी ऑफ़र करता है:

इस गाइड में, इन लाइब्रेरी से Google Identity सेवा की लाइब्रेरी पर माइग्रेट करने के निर्देश दिए गए हैं.

इस गाइड की मदद से, आप:

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

पहचान सेवाओं की JavaScript लाइब्रेरी में क्या बदलाव हुए हैं, इस बारे में जानकारी पाने के लिए, खास जानकारी पढ़ें और मुख्य शब्दों और सिद्धांतों की समीक्षा करने के लिए, Google की अनुमति कैसे मिलती है लेख पढ़ें.

अगर आप उपयोगकर्ता साइन-अप और साइन-इन के लिए पुष्टि करना चाहते हैं, तो Google साइन-इन से माइग्रेट करना देखें.

अनुमति देने के अपने फ़्लो की पहचान करना

दो तरह के उपयोगकर्ता ऑथराइज़ेशन फ़्लो हो सकते हैं: इंप्लिसिट और ऑथराइज़ेशन कोड.

अपने वेब ऐप्लिकेशन की समीक्षा करके पता लगाएं कि फ़िलहाल किस तरह की अनुमति देने का इस्तेमाल किया जा रहा है.

आपका वेब ऐप्लिकेशन इंप्लिसिट फ़्लो का इस्तेमाल कर रहा है:

  • आपका वेब ऐप्लिकेशन पूरी तरह से ब्राउज़र पर आधारित है, जिसके लिए कोई बैकएंड प्लैटफ़ॉर्म नहीं है.
  • उपयोगकर्ता को Google API कॉल करने के लिए कॉल में शामिल होना होगा. आपका ऐप्लिकेशन सिर्फ़ टोकन का इस्तेमाल करता है और रीफ़्रेश टोकन की ज़रूरत नहीं होती.
  • आपका वेब ऐप्लिकेशन apis.google.com/js/api.js पर लोड हो रहा है.
  • आपकी कार्रवाई क्लाइंट-साइड वेब ऐप्लिकेशन के लिए OAuth 2.0 पर आधारित है.
  • आपके ऐप्लिकेशन में gapi.clientgapi.auth2JavaScript के लिए Google API क्लाइंट लाइब्रेरी में पाए गए मॉड्यूल का इस्तेमाल किया जा सकता है.

आपके वेब ऐप्लिकेशन में ऑथराइज़ेशन कोड फ़्लो का इस्तेमाल किए जाने के बारे में जानकारी:

  • आपकी लागू की गई जानकारी इन बातों पर आधारित है:

  • आपका ऐप्लिकेशन, उपयोगकर्ता के ब्राउज़र और आपके बैकएंड प्लैटफ़ॉर्म, दोनों पर काम करता है.

  • आपका बैकएंड प्लैटफ़ॉर्म, ऑथराइज़ेशन कोड एंडपॉइंट होस्ट करता है.

  • आपका बैकएंड प्लैटफ़ॉर्म, उपयोगकर्ताओं की तरफ़ से Google API को कॉल करता है. इसके लिए, उन्हें मौजूद होना ज़रूरी नहीं है. इसे ऑफ़लाइन मोड भी कहा जाता है.

  • रीफ़्रेश टोकन को आपके बैकएंड प्लैटफ़ॉर्म से मैनेज और स्टोर किया जाता है.

कुछ मामलों में, आपके कोडबेस में दोनों फ़्लो इस्तेमाल किए जा सकते हैं.

अनुमति देने का तरीका चुनें

डेटा दूसरी जगह भेजने से पहले आपको यह तय करना होगा कि अपने मौजूदा फ़्लो के साथ आगे बढ़ना या किसी दूसरे फ़्लो का इस्तेमाल करना, आपकी ज़रूरतों को पूरा करता है या नहीं.

दोनों फ़्लो के बीच के अंतर और रुकावटों को समझने के लिए, ऑथराइज़ेशन फ़्लो चुनें.

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

नीचे दिए गए सिलेक्टर का इस्तेमाल करके अनुमति देने का फ़्लो चुनें.

इंप्लिसिट फ़्लो

उपयोगकर्ता के मौजूद होने पर ब्राउज़र में इस्तेमाल के लिए एक ऐक्सेस टोकन पाएं.

इंप्लिसिट फ़्लो के उदाहरण पहचान सेवाओं पर माइग्रेट करने से पहले और बाद में, वेब ऐप्लिकेशन दिखाते हैं.

ऑथराइज़ेशन कोड फ़्लो

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

ऑथराइज़ेशन कोड फ़्लो के उदाहरण पहचान सेवाओं पर माइग्रेट करने से पहले और बाद में वेब ऐप्लिकेशन दिखाते हैं.

इस पूरी गाइड में, जोड़ें, हटाएं, अपडेट करें या मौजूदा सुविधा बदलें में दिए गए निर्देशों को फ़ॉलो करें.

आपके ब्राउज़र के वेब ऐप्लिकेशन में हुए बदलाव

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

प्रभावित कोड और परीक्षण की पहचान करना

डीबग कुकी, प्रभावित कोड का पता लगाने और टैग को बंद करने के बाद के व्यवहार की जांच करने में मदद कर सकती है.

बड़े या जटिल ऐप्लिकेशन में, ऐसे सभी कोड को ढूंढना मुश्किल हो सकता है जिन पर gapi.auth2 मॉड्यूल के बंद होने का असर पड़ा है. कंसोल में जल्द ही बंद होने वाले फ़ंक्शन के मौजूदा इस्तेमाल को लॉग करने के लिए, G_AUTH2_MIGRATION कुकी की वैल्यू को informational पर सेट करें. वैकल्पिक तौर पर, सेशन स्टोरेज में लॉग इन करने के लिए, कोलन के बाद एक मुख्य वैल्यू भी जोड़ें. साइन इन करने और क्रेडेंशियल की समीक्षा मिलने या इकट्ठा किए गए लॉग को बाद में विश्लेषण के लिए बैकएंड में भेजने के बाद. उदाहरण के लिए, informational:showauth2use, ऑरिजिन और यूआरएल को showauth2use नाम की सेशन स्टोरेज कुंजी में सेव करता है.

gapi.auth2 मॉड्यूल लोड न होने पर, ऐप्लिकेशन के काम करने के तरीके की पुष्टि करने के लिए, G_AUTH2_MIGRATION कुकी की वैल्यू को enforced पर सेट करें. इससे, लागू होने की तारीख से पहले, सेवा बंद होने के बाद के व्यवहार की जांच करने की सुविधा मिलेगी.

संभावित G_AUTH2_MIGRATION कुकी मान:

  • enforced gapi.auth2 मॉड्यूल लोड न करें.
  • informational का इस्तेमाल करके, JS कंसोल में फ़ंक्शन का इस्तेमाल बंद करें. इसके अलावा, वैकल्पिक कुंजी के नाम को सेट करने पर भी, सेशन के स्टोरेज में लॉग इन करें: informational:key-name.

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

लाइब्रेरी और मॉड्यूल

gapi.auth2 मॉड्यूल, साइन इन करने के लिए उपयोगकर्ता की पुष्टि करने की प्रक्रिया को मैनेज करता है. साथ ही, अनुमति देने के तरीकों में इंप्लिसिट फ़्लो की सुविधा को मैनेज करता है. साथ ही, इस मॉड्यूल को बंद करता है और इसके ऑब्जेक्ट और तरीकों को Google Identity सेवाओं की लाइब्रेरी से बदला जाता है.

अपने वेब ऐप्लिकेशन में पहचान सेवाएं लाइब्रेरी को जोड़ें, ताकि उसे आपके दस्तावेज़ में शामिल किया जा सके:

<script src="https://accounts.google.com/gsi/client" async defer></script>

gapi.load('auth2', function) का इस्तेमाल करके, auth2 मॉड्यूल को लोड करने के सभी इंस्टेंस हटाएं.

Google पहचान सेवाएं लाइब्रेरी gapi.auth2 मॉड्यूल के इस्तेमाल की जगह लेती है. gapi.client

कुकी

उपयोगकर्ता की अनुमति के लिए कुकी का इस्तेमाल करने की ज़रूरत नहीं है.

Google साइन-इन से माइग्रेट करने के लिए देखें कि उपयोगकर्ता की पुष्टि करने के लिए, कुकी का इस्तेमाल कैसे किया जाता है. Google, कुकी और अन्य प्रॉडक्ट को Google के प्रॉडक्ट और सेवाओं से इस्तेमाल करने के लिए, कुकी का इस्तेमाल कैसे करता है.

क्रेडेंशियल

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

इन बदलावों को देखने के लिए, क्रेडेंशियल के उदाहरण देखें.

इंप्लिसिट फ़्लो

उपयोगकर्ता की पुष्टि करने और अनुमति देने को अलग-अलग करने के लिए, उपयोगकर्ता की प्रोफ़ाइल को हैंडल करने की अनुमति के फ़्लो से हटाएं.

'Google साइन-इन' JavaScript क्लाइंट रेफ़रंस को हटाएं:

तरीके

  • GoogleUser.getBasicProfile()
  • GoogleUser.getId()

ऑथराइज़ेशन कोड फ़्लो

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

सत्र की स्थिति

पहले, 'Google साइन-इन' की मदद से, आप साइन इन की स्थिति को मैनेज कर पाते थे, ताकि:

आप अपने वेब ऐप्लिकेशन पर साइन-इन की स्थिति और उपयोगकर्ता सेशन को मैनेज करने के लिए ज़िम्मेदार हैं.

'Google साइन-इन' JavaScript क्लाइंट रेफ़रंस को हटाएं:

ऑब्जेक्ट:

  • gapi.auth2.SignInOptions

तरीके:

  • GoogleAuth.attachClickHandler()
  • GoogleAuth.isSignedIn()
  • GoogleAuth.isSignedIn.get()
  • GoogleAuth.isSignedIn.listen()
  • GoogleAuth.signIn()
  • GoogleAuth.signOut()
  • GoogleAuth.currentUser.get()
  • GoogleAuth.currentUser.listen()
  • GoogleUser.isSignedIn()

क्लाइंट कॉन्फ़िगरेशन

टोकन क्लाइंट को इंप्लिसिट या ऑथराइज़ेशन कोड फ़्लो के लिए शुरू करने के लिए, अपने वेब ऐप्लिकेशन को अपडेट करें.

'Google साइन-इन' JavaScript क्लाइंट रेफ़रंस को हटाएं:

ऑब्जेक्ट:

  • gapi.auth2.ClientConfig
  • gapi.auth2.OfflineAccessOptions

तरीके:

  • gapi.auth2.getAuthInstance()
  • GoogleUser.grant()

इंप्लिसिट फ़्लो

वेब ऐप्लिकेशन कॉन्फ़िगर करने के लिए, TokenClientConfig ऑब्जेक्ट और initTokenClient() जोड़ें. टोकन क्लाइंट को शुरू करने के लिए, यहां बताया गया उदाहरण देखें.

बदलें Google साइन-इन JavaScript क्लाइंट रेफ़रंस को Google Identity सेवाओं से बदलें:

ऑब्जेक्ट:

  • TokenClientConfig वाला/वाली gapi.auth2.AuthorizeConfig

तरीके:

  • google.accounts.oauth2.initTokenClient() वाला/वाली gapi.auth2.init()

पैरामीटर:

  • gapi.auth2.AuthorizeConfig.login_hint के साथ TokenClientConfig.hint.
  • gapi.auth2.GoogleUser.getHostedDomain() के साथ TokenClientConfig.hosted_domain.

ऑथराइज़ेशन कोड फ़्लो

अपना वेब ऐप्लिकेशन कॉन्फ़िगर करने के लिए CodeClientConfig ऑब्जेक्ट और initCodeClient() कॉल करें, जोकोड क्लाइंट की शुरुआत करता है में दिए गए उदाहरण के मुताबिक.

इंप्लिसिट कोड से ऑथराइज़ेशन कोड फ़्लो पर स्विच करने पर:

हटाएं Google साइन-इन JavaScript क्लाइंट के रेफ़रंस

ऑब्जेक्ट:

  • gapi.auth2.AuthorizeConfig

तरीके:

  • gapi.auth2.init()

पैरामीटर:

  • gapi.auth2.AuthorizeConfig.login_hint
  • gapi.auth2.GoogleUser.getHostedDomain()

टोकन का अनुरोध

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

इंप्लिसिट फ़्लो

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

बदलें 'Google साइन-इन' JavaScript क्लाइंट की पहचान फ़ाइलें: Google Identity सेवाओं के साथ:

तरीके:

  • TokenClient.requestAccessToken() वाला/वाली gapi.auth2.authorize()
  • TokenClient.requestAccessToken() वाला/वाली GoogleUser.reloadAuthResponse()

ऐक्सेस टोकन का अनुरोध करने के लिए, पॉप-अप UX फ़्लो शुरू करने के लिए या requestAccessToken()मौजूदा टोकन के खत्म होने पर नया टोकन पाने के लिए, requestAccessToken()को कॉल करने के लिए लिंक या बटन जोड़ें.

अपने कोडबेस को अपडेट करें:

  • requestAccessToken() के साथ OAuth 2.0 टोकन फ़्लो को ट्रिगर करें.
  • कई छोटे-छोटे दायरों के लिए एक ही अनुरोध को कई छोटे अनुरोधों में अलग-अलग करने के लिए, requestAccessToken और OverridableTokenClientConfig का इस्तेमाल करके इंक्रीमेंटल ऑथराइज़ेशन को बढ़ावा दें.
  • मौजूदा टोकन की समय-सीमा खत्म होने या उसे निरस्त होने पर नए टोकन का अनुरोध करें.

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

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

ऑथराइज़ेशन कोड फ़्लो

Google से एक ऑथराइज़ेशन कोड का अनुरोध करने के लिए, requestCode() पर कॉल करने के लिए, लिंक या बटन जोड़ें. उदाहरण के लिए, OAuth 2.0 कोड फ़्लो ट्रिगर करें देखें.

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

टोकन मैनेज करना

समय-सीमा खत्म होने या रद्द कर दी गई ऐक्सेस टोकन का इस्तेमाल करने और नए या मान्य ऐक्सेस टोकन का अनुरोध करने के लिए, 'Google एपीआई कॉल' में गड़बड़ी का पता लगाने के लिए जोड़ें गड़बड़ी हैंडल करें.

समय-सीमा खत्म होने या निरस्त किए गए ऐक्सेस टोकन का इस्तेमाल करने पर, Google API की मदद से, 401 Unauthorized और invalid_token गड़बड़ी के मैसेज का एचटीटीपी स्टेटस कोड दिखाया जाता है. उदाहरण के लिए, अमान्य टोकन का जवाब देखें.

टोकन की समयसीमा खत्म हो गई है

ऐक्सेस टोकन कुछ समय के लिए इस्तेमाल किए जाते हैं और अक्सर कुछ ही मिनटों के लिए मान्य होते हैं.

टोकन निरस्त करना

किसी भी समय, Google खाते का मालिक, पहले दी गई सहमति को निरस्त कर सकता है. ऐसा करने से मौजूदा ऐक्सेस टोकन अमान्य हो जाते हैं और टोकन रीफ़्रेश हो जाते हैं. revoke()का इस्तेमाल करके या Google खाते की मदद से, आपके प्लैटफ़ॉर्म से निरस्त किया जा सकता है.

बदलें 'Google साइन-इन' JavaScript क्लाइंट की पहचान फ़ाइलें: Google Identity सेवाओं के साथ:

तरीके:

  • google.accounts.oauth2.revoke() वाला/वाली getAuthInstance().disconnect()
  • google.accounts.oauth2.revoke() वाला/वाली GoogleUser.disconnect()

जब कोई उपयोगकर्ता आपके प्लैटफ़ॉर्म से अपना खाता मिटाता है या आपके ऐप्लिकेशन के साथ डेटा शेयर करने की सहमति हटाना चाहता है, तो revoke को कॉल करें.

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

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

उपयोगकर्ता का साइन इन करना

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

  • इससे, उपयोगकर्ता के साइन इन करने की संख्या कम हो जाती है. अगर कोई चालू सेशन पहले से मौजूद नहीं है, तो ऐक्सेस टोकन का अनुरोध करके Google खाते में साइन इन करने की प्रोसेस शुरू हो जाती है.
  • CodeClientConfig या TokenClientConfig ऑब्जेक्ट में hint पैरामीटर की वैल्यू के तौर पर, JWT आईडी टोकन क्रेडेंशियल email फ़ील्ड का सीधे तौर पर इस्तेमाल करें. यह खास तौर पर तब मददगार होता है, जब आपका प्लैटफ़ॉर्म उपयोगकर्ता खाते का मैनेजमेंट सिस्टम बनाए नहीं रखता.
  • अपने प्लैटफ़ॉर्म पर मौजूद किसी मौजूदा स्थानीय उपयोगकर्ता खाते से, Google खाते को खोजें और असोसिएट करें. इससे आपके प्लैटफ़ॉर्म पर डुप्लीकेट खातों की संख्या कम होती है.
  • जब एक नया, स्थानीय खाता बनाया जाता है, तो आपके साइन-अप डायलॉग और फ़्लो साफ़ तौर पर उपयोगकर्ता की पुष्टि वाले डायलॉग और फ़्लो से अलग किए जा सकते हैं. इससे ज़रूरी चरणों की संख्या कम हो सकती है और ड्रॉप-ऑफ़ दर बेहतर हो सकती है.

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

सहमति के बाद, ऐक्सेस टोकन को उपयोगकर्ता के स्वीकार या अस्वीकार किए गए दायरों की सूची के साथ लौटाया जाता है.

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

इंप्लिसिट फ़्लो

बदलें Google साइन-इन JavaScript क्लाइंट रेफ़रंस को Google Identity सेवाओं से बदलें:

ऑब्जेक्ट:

  • TokenClient.TokenResponse वाला/वाली gapi.auth2.AuthorizeResponse
  • TokenClient.TokenResponse वाला/वाली gapi.auth2.AuthResponse

तरीके:

  • google.accounts.oauth2.hasGrantedAllScopes() वाला/वाली GoogleUser.hasGrantedScopes()
  • google.accounts.oauth2.hasGrantedAllScopes() वाला/वाली GoogleUser.getGrantedScopes()

हटाएं Google साइन-इन JavaScript क्लाइंट के रेफ़रंस:

तरीके:

  • GoogleUser.getAuthResponse()

अपने hasGrantedAllScopes() ऐप्लिकेशन और hasGrantedAllScopes() के साथ, वेब ऐप्लिकेशन को अपडेट करें. इसके लिए, खास अनुमतियों के उदाहरण का पालन करें.

ऑथराइज़ेशन कोड फ़्लो

पुष्टि करने के कोड को मैनेज करने में दिए गए निर्देशों का पालन करके, अपने बैकएंड प्लैटफ़ॉर्म में ऑथराइज़ेशन कोड एंडपॉइंट को अपडेट करें या जोड़ें.

अनुरोध की पुष्टि करने और ऐक्सेस टोकन पाने के लिए, कोड मॉडल का इस्तेमाल करें गाइड में बताया गया तरीका अपनाएं. इसके बाद, अपने पेज को अपडेट करें.

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

इंप्लिसिट फ़्लो के उदाहरण

पुराना तरीका

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

उपयोगकर्ता की सहमति के लिए पॉप-अप डायलॉग का इस्तेमाल करके, ब्राउज़र में चल रही JavaScript के लिए Google API क्लाइंट लाइब्रेरी का उदाहरण.

gapi.auth2 मॉड्यूल अपने-आप लोड होता है और gapi.client.init() इसका इस्तेमाल करता है. इसलिए, यह छिप जाता है.

<!DOCTYPE html>
  <html>
    <head>
      <script src="https://apis.google.com/js/api.js"></script>
      <script>
        function start() {
          gapi.client.init({
            'apiKey': 'YOUR_API_KEY',
            'clientId': 'YOUR_CLIENT_ID',
            'scope': 'https://www.googleapis.com/auth/cloud-translation',
            'discoveryDocs': ['https://www.googleapis.com/discovery/v1/apis/translate/v2/rest'],
          }).then(function() {
            // Execute an API request which is returned as a Promise.
            // The method name language.translations.list comes from the API discovery.
            return gapi.client.language.translations.list({
              q: 'hello world',
              source: 'en',
              target: 'de',
            });
          }).then(function(response) {
            console.log(response.result.data.translations[0].translatedText);
          }, function(reason) {
            console.log('Error: ' + reason.result.error.message);
          });
        };

        // Load the JavaScript client library and invoke start afterwards.
        gapi.load('client', start);
      </script>
    </head>
    <body>
      <div id="results"></div>
    </body>
  </html>

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

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

gapi.auth2 मॉड्यूल मैन्युअल तरीके से लोड होता है.

<!DOCTYPE html>
<html><head></head><body>
<script>
  var GoogleAuth;
  var SCOPE = 'https://www.googleapis.com/auth/drive.metadata.readonly';
  function handleClientLoad() {
    // Load the API's client and auth2 modules.
    // Call the initClient function after the modules load.
    gapi.load('client:auth2', initClient);
  }

  function initClient() {
    // In practice, your app can retrieve one or more discovery documents.
    var discoveryUrl = 'https://www.googleapis.com/discovery/v1/apis/drive/v3/rest';

    // Initialize the gapi.client object, which app uses to make API requests.
    // Get API key and client ID from API Console.
    // 'scope' field specifies space-delimited list of access scopes.
    gapi.client.init({
        'apiKey': 'YOUR_API_KEY',
        'clientId': 'YOUR_CLIENT_ID',
        'discoveryDocs': [discoveryUrl],
        'scope': SCOPE
    }).then(function () {
      GoogleAuth = gapi.auth2.getAuthInstance();

      // Listen for sign-in state changes.
      GoogleAuth.isSignedIn.listen(updateSigninStatus);

      // Handle initial sign-in state. (Determine if user is already signed in.)
      var user = GoogleAuth.currentUser.get();
      setSigninStatus();

      // Call handleAuthClick function when user clicks on
      //      "Sign In/Authorize" button.
      $('#sign-in-or-out-button').click(function() {
        handleAuthClick();
      });
      $('#revoke-access-button').click(function() {
        revokeAccess();
      });
    });
  }

  function handleAuthClick() {
    if (GoogleAuth.isSignedIn.get()) {
      // User is authorized and has clicked "Sign out" button.
      GoogleAuth.signOut();
    } else {
      // User is not signed in. Start Google auth flow.
      GoogleAuth.signIn();
    }
  }

  function revokeAccess() {
    GoogleAuth.disconnect();
  }

  function setSigninStatus() {
    var user = GoogleAuth.currentUser.get();
    var isAuthorized = user.hasGrantedScopes(SCOPE);
    if (isAuthorized) {
      $('#sign-in-or-out-button').html('Sign out');
      $('#revoke-access-button').css('display', 'inline-block');
      $('#auth-status').html('You are currently signed in and have granted ' +
          'access to this app.');
    } else {
      $('#sign-in-or-out-button').html('Sign In/Authorize');
      $('#revoke-access-button').css('display', 'none');
      $('#auth-status').html('You have not authorized this app or you are ' +
          'signed out.');
    }
  }

  function updateSigninStatus() {
    setSigninStatus();
  }
</script>

<button id="sign-in-or-out-button"
        style="margin-left: 25px">Sign In/Authorize</button>
<button id="revoke-access-button"
        style="display: none; margin-left: 25px">Revoke access</button>

<div id="auth-status" style="display: inline; padding-left: 25px"></div><hr>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script async defer src="https://apis.google.com/js/api.js"
        onload="this.onload=function(){};handleClientLoad()"
        onreadystatechange="if (this.readyState === 'complete') this.onload()">
</script>
</body></html>

OAuth 2.0 एंडपॉइंट

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

यह उदाहरण, उपयोगकर्ता के ब्राउज़र से Google और #39; OAuth 2.0 एंडपॉइंट को सीधे तौर पर कॉल करता है. साथ ही, gapi.auth2 मॉड्यूल या JavaScript लाइब्रेरी का इस्तेमाल नहीं करता है.

<!DOCTYPE html>
<html><head></head><body>
<script>
  var YOUR_CLIENT_ID = 'REPLACE_THIS_VALUE';
  var YOUR_REDIRECT_URI = 'REPLACE_THIS_VALUE';
  var fragmentString = location.hash.substring(1);

  // Parse query string to see if page request is coming from OAuth 2.0 server.
  var params = {};
  var regex = /([^&=]+)=([^&]*)/g, m;
  while (m = regex.exec(fragmentString)) {
    params[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
  }
  if (Object.keys(params).length > 0) {
    localStorage.setItem('oauth2-test-params', JSON.stringify(params) );
    if (params['state'] && params['state'] == 'try_sample_request') {
      trySampleRequest();
    }
  }

  // If there's an access token, try an API request.
  // Otherwise, start OAuth 2.0 flow.
  function trySampleRequest() {
    var params = JSON.parse(localStorage.getItem('oauth2-test-params'));
    if (params && params['access_token']) {
      var xhr = new XMLHttpRequest();
      xhr.open('GET',
          'https://www.googleapis.com/drive/v3/about?fields=user&' +
          'access_token=' + params['access_token']);
      xhr.onreadystatechange = function (e) {
        if (xhr.readyState === 4 && xhr.status === 200) {
          console.log(xhr.response);
        } else if (xhr.readyState === 4 && xhr.status === 401) {
          // Token invalid, so prompt for user permission.
          oauth2SignIn();
        }
      };
      xhr.send(null);
    } else {
      oauth2SignIn();
    }
  }

  /*
   * Create form to request access token from Google's OAuth 2.0 server.
   */
  function oauth2SignIn() {
    // Google's OAuth 2.0 endpoint for requesting an access token
    var oauth2Endpoint = 'https://accounts.google.com/o/oauth2/v2/auth';

    // Create element to open OAuth 2.0 endpoint in new window.
    var form = document.createElement('form');
    form.setAttribute('method', 'GET'); // Send as a GET request.
    form.setAttribute('action', oauth2Endpoint);

    // Parameters to pass to OAuth 2.0 endpoint.
    var params = {'client_id': YOUR_CLIENT_ID,
                  'redirect_uri': YOUR_REDIRECT_URI,
                  'scope': 'https://www.googleapis.com/auth/drive.metadata.readonly',
                  'state': 'try_sample_request',
                  'include_granted_scopes': 'true',
                  'response_type': 'token'};

    // Add form parameters as hidden input values.
    for (var p in params) {
      var input = document.createElement('input');
      input.setAttribute('type', 'hidden');
      input.setAttribute('name', p);
      input.setAttribute('value', params[p]);
      form.appendChild(input);
    }

    // Add form to page and submit it to open the OAuth 2.0 endpoint.
    document.body.appendChild(form);
    form.submit();
  }
</script>

<button onclick="trySampleRequest();">Try sample request</button>
</body></html>

नया तरीका

सिर्फ़ GIS

इस उदाहरण में उपयोगकर्ता की सहमति के लिए, सिर्फ़ Google पहचान सेवा की JavaScript लाइब्रेरी टोकन का मॉडल और पॉप-अप डायलॉग इस्तेमाल किया जा रहा है. इसमें क्लाइंट को कॉन्फ़िगर करने, ऐक्सेस टोकन पाने, और ऐक्सेस टोकन पाने के लिए ज़रूरी कम से कम चरणों को दिखाने और Google API को कॉल करने के बारे में बताया गया है.

<!DOCTYPE html>
<html>
  <head>
    <script src="https://accounts.google.com/gsi/client" onload="initClient()" async defer></script>
  </head>
  <body>
    <script>
      var client;
      var access_token;

      function initClient() {
        client = google.accounts.oauth2.initTokenClient({
          client_id: 'YOUR_CLIENT_ID',
          scope: 'https://www.googleapis.com/auth/calendar.readonly \
                  https://www.googleapis.com/auth/contacts.readonly',
          callback: (tokenResponse) => {
            access_token = tokenResponse.access_token;
          },
        });
      }
      function getToken() {
        client.requestAccessToken();
      }
      function revokeToken() {
        google.accounts.oauth2.revoke(access_token, () => {console.log('access token revoked')});
      }
      function loadCalendar() {
        var xhr = new XMLHttpRequest();
        xhr.open('GET', 'https://www.googleapis.com/calendar/v3/calendars/primary/events');
        xhr.setRequestHeader('Authorization', 'Bearer ' + access_token);
        xhr.send();
      }
    </script>
    <h1>Google Identity Services Authorization Token model</h1>
    <button onclick="getToken();">Get access token</button><br><br>
    <button onclick="loadCalendar();">Load Calendar</button><br><br>
    <button onclick="revokeToken();">Revoke token</button>
  </body>
</html>

GAPI (एपीआई) एक साथ काम नहीं करना/जाना

इस उदाहरण में टोकन मॉडल का इस्तेमाल करके, Google पहचान सेवा लाइब्रेरी जोड़ने का तरीका बताया गया है. gapi.auth2मॉड्यूल को हटाया गया है और JavaScript के लिए Google API क्लाइंट लाइब्रेरी का इस्तेमाल करके, एपीआई को कॉल किया गया है.

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

हो सकता है कि पेज के पहली बार लोड होने पर या ऐक्सेस टोकन की समयसीमा खत्म होने के बाद, ऐक्सेस टोकन मौजूद न होने पर उपयोगकर्ताओं के लिए 'Calendar दिखाएं##39; बटन दबाया जाए.

<!DOCTYPE html>
<html>
<head></head>
<body>
  <h1>GAPI with GIS async/await</h1>
  <button id="showEventsBtn" onclick="showEvents();">Show Calendar</button><br><br>
  <button id="revokeBtn" onclick="revokeToken();">Revoke access token</button>

  <script>

    const gapiLoadPromise = new Promise((resolve, reject) => {
      gapiLoadOkay = resolve;
      gapiLoadFail = reject;
    });
    const gisLoadPromise = new Promise((resolve, reject) => {
      gisLoadOkay = resolve;
      gisLoadFail = reject;
    });

    var tokenClient;

    (async () => {
      document.getElementById("showEventsBtn").style.visibility="hidden";
      document.getElementById("revokeBtn").style.visibility="hidden";

      // First, load and initialize the gapi.client
      await gapiLoadPromise;
      await new Promise((resolve, reject) => {
        // NOTE: the 'auth2' module is no longer loaded.
        gapi.load('client', {callback: resolve, onerror: reject});
      });
      await gapi.client.init({
        // NOTE: OAuth2 'scope' and 'client_id' parameters have moved to initTokenClient().
      })
      .then(function() {  // Load the Calendar API discovery document.
        gapi.client.load('https://www.googleapis.com/discovery/v1/apis/calendar/v3/rest');
      });

      // Now load the GIS client
      await gisLoadPromise;
      await new Promise((resolve, reject) => {
        try {
          tokenClient = google.accounts.oauth2.initTokenClient({
              client_id: 'YOUR_CLIENT_ID',
              scope: 'https://www.googleapis.com/auth/calendar.readonly',
              prompt: 'consent',
              callback: '',  // defined at request time in await/promise scope.
          });
          resolve();
        } catch (err) {
          reject(err);
        }
      });

      document.getElementById("showEventsBtn").style.visibility="visible";
      document.getElementById("revokeBtn").style.visibility="visible";
    })();

    async function getToken(err) {

      if (err.result.error.code == 401 || (err.result.error.code == 403) &&
          (err.result.error.status == "PERMISSION_DENIED")) {

        // The access token is missing, invalid, or expired, prompt for user consent to obtain one.
        await new Promise((resolve, reject) => {
          try {
            // Settle this promise in the response callback for requestAccessToken()
            tokenClient.callback = (resp) => {
              if (resp.error !== undefined) {
                reject(resp);
              }
              // GIS has automatically updated gapi.client with the newly issued access token.
              console.log('gapi.client access token: ' + JSON.stringify(gapi.client.getToken()));
              resolve(resp);
            };
            tokenClient.requestAccessToken();
          } catch (err) {
            console.log(err)
          }
        });
      } else {
        // Errors unrelated to authorization: server errors, exceeding quota, bad requests, and so on.
        throw new Error(err);
      }
    }

    function showEvents() {

      // Try to fetch a list of Calendar events. If a valid access token is needed,
      // prompt to obtain one and then retry the original request.
      gapi.client.calendar.events.list({ 'calendarId': 'primary' })
      .then(calendarAPIResponse => console.log(JSON.stringify(calendarAPIResponse)))
      .catch(err  => getToken(err))  // for authorization errors obtain an access token
      .then(retry => gapi.client.calendar.events.list({ 'calendarId': 'primary' }))
      .then(calendarAPIResponse => console.log(JSON.stringify(calendarAPIResponse)))
      .catch(err  => console.log(err));   // cancelled by user, timeout, etc.
    }

    function revokeToken() {
      let cred = gapi.client.getToken();
      if (cred !== null) {
        google.accounts.oauth2.revoke(cred.access_token, () => {console.log('Revoked: ' + cred.access_token)});
        gapi.client.setToken('');
      }
    }

  </script>

  <script async defer src="https://apis.google.com/js/api.js" onload="gapiLoadOkay()" onerror="gapiLoadFail(event)"></script>
  <script async defer src="https://accounts.google.com/gsi/client" onload="gisLoadOkay()" onerror="gisLoadFail(event)"></script>

</body>
</html>

GAPI कॉलबैक

इस उदाहरण में टोकन मॉडल का इस्तेमाल करके, Google पहचान सेवा लाइब्रेरी जोड़ने का तरीका बताया गया है. gapi.auth2मॉड्यूल को हटाया गया है और JavaScript के लिए Google API क्लाइंट लाइब्रेरी का इस्तेमाल करके, एपीआई को कॉल किया गया है.

वैरिएबल का इस्तेमाल, लाइब्रेरी के लोड होने के क्रम को लागू करने के लिए किया जाता है. एक मान्य ऐक्सेस टोकन मिलने के बाद, कॉलबैक से GAPI कॉल की जाती है.

उम्मीद की जाती है कि जब उपयोगकर्ता पहली बार पेज लोड होगा, तब वे कैलेंडर दिखाएं बटन पर क्लिक करेंगे.

<!DOCTYPE html>
<html>
<head>
  <script async defer src="https://apis.google.com/js/api.js" onload="gapiLoad()"></script>
  <script async defer src="https://accounts.google.com/gsi/client" onload="gisInit()"></script>
</head>
<body>
  <h1>GAPI with GIS callbacks</h1>
  <button id="showEventsBtn" onclick="showEvents();">Show Calendar</button><br><br>
  <button id="revokeBtn" onclick="revokeToken();">Revoke access token</button>
  <script>
    let tokenClient;
    let gapiInited;
    let gisInited;

    document.getElementById("showEventsBtn").style.visibility="hidden";
    document.getElementById("revokeBtn").style.visibility="hidden";

    function checkBeforeStart() {
       if (gapiInited && gisInited){
          // Start only when both gapi and gis are initialized.
          document.getElementById("showEventsBtn").style.visibility="visible";
          document.getElementById("revokeBtn").style.visibility="visible";
       }
    }

    function gapiInit() {
      gapi.client.init({
        // NOTE: OAuth2 'scope' and 'client_id' parameters have moved to initTokenClient().
      })
      .then(function() {  // Load the Calendar API discovery document.
        gapi.client.load('https://www.googleapis.com/discovery/v1/apis/calendar/v3/rest');
        gapiInited = true;
        checkBeforeStart();
      });
    }

    function gapiLoad() {
        gapi.load('client', gapiInit)
    }

    function gisInit() {
     tokenClient = google.accounts.oauth2.initTokenClient({
                client_id: 'YOUR_CLIENT_ID',
                scope: 'https://www.googleapis.com/auth/calendar.readonly',
                callback: '',  // defined at request time
            });
      gisInited = true;
      checkBeforeStart();
    }

    function showEvents() {

      tokenClient.callback = (resp) => {
        if (resp.error !== undefined) {
          throw(resp);
        }
        // GIS has automatically updated gapi.client with the newly issued access token.
        console.log('gapi.client access token: ' + JSON.stringify(gapi.client.getToken()));

        gapi.client.calendar.events.list({ 'calendarId': 'primary' })
        .then(calendarAPIResponse => console.log(JSON.stringify(calendarAPIResponse)))
        .catch(err => console.log(err));

        document.getElementById("showEventsBtn").innerText = "Refresh Calendar";
      }

      // Conditionally ask users to select the Google Account they'd like to use,
      // and explicitly obtain their consent to fetch their Calendar.
      // NOTE: To request an access token a user gesture is necessary.
      if (gapi.client.getToken() === null) {
        // Prompt the user to select an Google Account and asked for consent to share their data
        // when establishing a new session.
        tokenClient.requestAccessToken({prompt: 'consent'});
      } else {
        // Skip display of account chooser and consent dialog for an existing session.
        tokenClient.requestAccessToken({prompt: ''});
      }
    }

    function revokeToken() {
      let cred = gapi.client.getToken();
      if (cred !== null) {
        google.accounts.oauth2.revoke(cred.access_token, () => {console.log('Revoked: ' + cred.access_token)});
        gapi.client.setToken('');
        document.getElementById("showEventsBtn").innerText = "Show Calendar";
      }
    }
  </script>
</body>
</html>

ऑथराइज़ेशन कोड फ़्लो के उदाहरण

'Google पहचान सेवा' लाइब्रेरी का पॉप-अप UX सीधे तौर पर आपके बैकएंड टोकन एंडपॉइंट पर ऑथराइज़ेशन कोड दिखाने के लिए, YouTube रीडायरेक्ट का इस्तेमाल कर सकता है. इसके अलावा, यह उपयोगकर्ता के #&39;s ब्राउज़र पर चलने वाला JavaScript कॉलबैक हैंडलर भी हो सकता है, जो आपके प्लैटफ़ॉर्म के लिए रिस्पॉन्स देता है. दोनों ही मामलों में, आपका बैकएंड प्लैटफ़ॉर्म OAuth 2.0 फ़्लो को पूरा करेगा, ताकि आप मान्य रीफ़्रेश और ऐक्सेस टोकन पा सकें.

पुराना तरीका

सर्वर साइड वेब ऐप्लिकेशन

सर्वर-साइड ऐप्लिकेशन के लिए Google साइन-इन उपयोगकर्ता की सहमति के लिए, Google के लिए रीडायरेक्ट का इस्तेमाल करके, बैकएंड प्लैटफ़ॉर्म पर चल रहा है.

<!DOCTYPE html>
<html>
  <head>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
    <script src="https://apis.google.com/js/client:platform.js?onload=start" async defer></script>
    <script>
      function start() {
        gapi.load('auth2', function() {
          auth2 = gapi.auth2.init({
            client_id: 'YOUR_CLIENT_ID',
            api_key: 'YOUR_API_KEY',
            discovery_docs: ['https://www.googleapis.com/discovery/v1/apis/translate/v2/rest'],
            // Scopes to request in addition to 'profile' and 'email'
            scope: 'https://www.googleapis.com/auth/cloud-translation',
          });
        });
      }
      function signInCallback(authResult) {
        if (authResult['code']) {
          console.log("sending AJAX request");
          // Send authorization code obtained from Google to backend platform
          $.ajax({
            type: 'POST',
            url: 'YOUR_AUTHORIZATION_CODE_ENDPOINT_URL',
            // Always include an X-Requested-With header to protect against CSRF attacks.
            headers: {
              'X-Requested-With': 'XMLHttpRequest'
            },
            contentType: 'application/octet-stream; charset=utf-8',
            success: function(result) {
              console.log(result);
            },
            processData: false,
            data: authResult['code']
          });
        } else {
          console.log('error: failed to obtain authorization code')
        }
      }
    </script>
  </head>
  <body>
    <button id="signinButton">Sign In With Google</button>
    <script>
      $('#signinButton').click(function() {
        // Obtain an authorization code from Google
        auth2.grantOfflineAccess().then(signInCallback);
      });
    </script>
  </body>
</html>

रीडायरेक्ट का इस्तेमाल करके एचटीटीपी/REST

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

/\*
 \* Create form to request access token from Google's OAuth 2.0 server.
 \*/
function oauthSignIn() {
  // Google's OAuth 2.0 endpoint for requesting an access token
  var oauth2Endpoint = 'https://accounts.google.com/o/oauth2/v2/auth';
  // Create &lt;form> element to submit parameters to OAuth 2.0 endpoint.
  var form = document.createElement('form');
  form.setAttribute('method', 'GET'); // Send as a GET request.
  form.setAttribute('action', oauth2Endpoint);
  // Parameters to pass to OAuth 2.0 endpoint.
  var params = {'client\_id': 'YOUR_CLIENT_ID',
                'redirect\_uri': 'YOUR_AUTHORIZATION_CODE_ENDPOINT_URL',
                'response\_type': 'token',
                'scope': 'https://www.googleapis.com/auth/drive.metadata.readonly',
                'include\_granted\_scopes': 'true',
                'state': 'pass-through value'};
  // Add form parameters as hidden input values.
  for (var p in params) {
    var input = document.createElement('input');
    input.setAttribute('type', 'hidden');
    input.setAttribute('name', p);
    input.setAttribute('value', params[p]);
    form.appendChild(input);
  }

  // Add form to page and submit it to open the OAuth 2.0 endpoint.
  document.body.appendChild(form);
  form.submit();
}

नया तरीका

GIS पॉप-अप UX

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

<!DOCTYPE html>
<html>
  <head>
    <script src="https://accounts.google.com/gsi/client" onload="initClient()" async defer></script>
  </head>
  <body>
    <script>
      var client;
      function initClient() {
        client = google.accounts.oauth2.initCodeClient({
          client_id: 'YOUR_CLIENT_ID',
          scope: 'https://www.googleapis.com/auth/calendar.readonly',
          ux_mode: 'popup',
          callback: (response) => {
            var code_receiver_uri = 'YOUR_AUTHORIZATION_CODE_ENDPOINT_URI',
            // Send auth code to your backend platform
            const xhr = new XMLHttpRequest();
            xhr.open('POST', code_receiver_uri, true);
            xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
            xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
            xhr.onload = function() {
              console.log('Signed in as: ' + xhr.responseText);
            };
            xhr.send('code=' + code);
            // After receipt, the code is exchanged for an access token and
            // refresh token, and the platform then updates this web app
            // running in user's browser with the requested calendar info.
          },
        });
      }
      function getAuthCode() {
        // Request authorization code and obtain user consent
          client.requestCode();
      }
    </script>
    <button onclick="getAuthCode();">Load Your Calendar</button>
  </body>
</html>

GIS रीडायरेक्ट UX

ऑथराइज़ेशन कोड मॉडल आपके पॉप-अप को होस्ट करने वाले एंडपॉइंट पर, हर उपयोगकर्ता ऑथराइज़ेशन कोड को भेजने के लिए, पॉप-अप और रीडायरेक्ट UX मोड के साथ काम करता है. रीडायरेक्ट UX मोड यहां दिखाया गया है:

<!DOCTYPE html>
<html>
  <head>
    <script src="https://accounts.google.com/gsi/client" onload="initClient()" async defer></script>
  </head>
  <body>
    <script>
      var client;
      function initClient() {
        client = google.accounts.oauth2.initCodeClient({
          client_id: 'YOUR_CLIENT_ID',
          scope: 'https://www.googleapis.com/auth/calendar.readonly \
                  https://www.googleapis.com/auth/photoslibrary.readonly',
          ux_mode: 'redirect',
          redirect_uri: 'YOUR_AUTHORIZATION_CODE_ENDPOINT_URI'
        });
      }
      // Request an access token
      function getAuthCode() {
        // Request authorization code and obtain user consent
          client.requestCode();
      }
    </script>
    <button onclick="getAuthCode();">Load Your Calendar</button>
  </body>
</html>

JavaScript लाइब्रेरी

Google पहचान सेवाएं एक ऐसी JavaScript लाइब्रेरी है जिसका इस्तेमाल उपयोगकर्ता की पुष्टि करने और अनुमति देने के लिए किया जाता है. यह लाइब्रेरी कई मॉड्यूल और मॉड्यूल में मिलने वाली सुविधाओं और काम करने के तरीके को एक साथ जोड़ती है और इनकी जगह लेती है:

पहचान सेवाओं को माइग्रेट करते समय की जाने वाली कार्रवाइयां:

मौजूदा JS लाइब्रेरी नई JS लाइब्रेरी नोट
apis.google.com/js/api.js accounts.google.com/gsi/client नई लाइब्रेरी जोड़ें और इंप्लिसिट फ़्लो को फ़ॉलो करें.
apis.google.com/js/client.js accounts.google.com/gsi/client नई लाइब्रेरी और ऑथराइज़ेशन कोड फ़्लो जोड़ें.

लाइब्रेरी का क्विक रेफ़रंस

पुरानी Google साइन-इन JavaScript क्लाइंट लाइब्रेरी और नई Google पहचान सेवाओं लाइब्रेरी और नोट के बीच ऑब्जेक्ट और मेथड की तुलना, जिसमें माइग्रेशन के दौरान ज़्यादा जानकारी और कार्रवाई की जानी चाहिए.

पुराना नया नोट
GoogleAuth ऑब्जेक्ट और उससे जुड़े तरीके:
GoogleAuth.attachClickHandler() हटाएं
GoogleAuth.currentUser.get() हटाएं
GoogleAuth.currentUser.listen() हटाएं
GoogleAuth.disconnect() google.accounts.oauth2.revke पुराने को नया बनाएं. निरस्तीकरण https://myaccount.google.com/permissions से भी हो सकता है
GoogleAuth.grantOfflineAccess() हटाएं, ऑथराइज़ेशन कोड फ़्लो का पालन करें.
GoogleAuth.isSignedIn.get() हटाएं
GoogleAuth.isSignedIn.listen() हटाएं
GoogleAuth.signIn() हटाएं
GoogleAuth.signOut() हटाएं
GoogleAuth.then() हटाएं
GoogleUser ऑब्जेक्ट और उससे जुड़े तरीके:
GoogleUser.disconnect() google.accounts.id.revoke पुराने को नया बनाएं. निरस्तीकरण https://myaccount.google.com/permissions से भी हो सकता है
GoogleUser.getAuthResponse() RequestCode() या RequestAccessToken() पुराने को नए से बदलें
GoogleUser.getबुनियादीप्रोफ़ाइल() हटाएं पर टैप करें. इसके बजाय, आईडी टोकन का इस्तेमाल करें और Google साइन इन से माइग्रेट करना देखें.
GoogleUser.getGrantedScopes() isGranted AnyScope() पुराने को नए से बदलें
GoogleUser.getHostedDomain() हटाएं
GoogleUser.getId() हटाएं
GoogleUser.grantOfflineAccess() हटाएं, ऑथराइज़ेशन कोड फ़्लो का पालन करें.
GoogleUser.grant() हटाएं
GoogleUser.hasGrantedScopes() isGranted AnyScope() पुराने को नए से बदलें
GoogleUser.isSignedIn() हटाएं
GoogleUser.reloadAuthResponse() RequestAccessToken() पुराना हटाएं. ऐक्सेस के लिए इस्तेमाल किए जा रहे टोकन को बदलने के लिए, नए कॉल करें.
gapi.auth2 ऑब्जेक्ट और उससे जुड़े तरीके:
gapi.auth2.AuthorConfig ऑब्जेक्ट टोकनClientConfig या CodeClientConfig पुराने को नए से बदलें
gapi.auth2.Authorization ऑब्जेक्ट हटाएं
gapi.auth2.AuthResponse ऑब्जेक्ट हटाएं
gapi.auth2.AUTHOR() RequestCode() या RequestAccessToken() पुराने को नए से बदलें
gapi.auth2.ClientConfig() टोकनClientConfig या CodeClientConfig पुराने को नए से बदलें
gapi.auth2.getAuthInstance() हटाएं
gapi.auth2.init() initTokenClient() या initCodeClient() पुराने को नए से बदलें
gapi.auth2.OfflineAccessOptions ऑब्जेक्ट हटाएं
gapi.auth2.SignInOptions ऑब्जेक्ट हटाएं
gapi.signin2 ऑब्जेक्ट और उससे जुड़े तरीके:
gapi.signin2.ender() हटाएं पर टैप करें. g_id_signin एलिमेंट का एचटीएमएल डीओएम लोड होने या Google.accounts.id.enderButton पर JS कॉल, Google खाते में साइन इन को ट्रिगर करता है.

क्रेडेंशियल के उदाहरण

मौजूदा क्रेडेंशियल

Google साइन इन की प्लैटफ़ॉर्म लाइब्रेरी, JavaScript के लिए Google API क्लाइंट लाइब्रेरी या Google Auth 2.0 एंडपॉइंट पर सीधे कॉल करने से, एक ही जवाब में OAuth 2.0 ऐक्सेस टोकन और OpenGL कनेक्ट आईडी टोकन, दोनों मिलते हैं.

रिस्पॉन्स का उदाहरण, जिसमें access_token और id_token, दोनों शामिल हैं:

  {
    "token_type": "Bearer",
    "access_token": "ya29.A0ARrdaM-SmArZaCIh68qXsZSzyeU-8mxhQERHrP2EXtxpUuZ-3oW8IW7a6D2J6lRnZrRj8S6-ZcIl5XVEqnqxq5fuMeDDH_6MZgQ5dgP7moY-yTiKR5kdPm-LkuPM-mOtUsylWPd1wpRmvw_AGOZ1UUCa6UD5Hg",
    "scope": "https://www.googleapis.com/auth/calendar.readonly",
    "login_hint": "AJDLj6I2d1RH77cgpe__DdEree1zxHjZJr4Q7yOisoumTZUmo5W2ZmVFHyAomUYzLkrluG-hqt4RnNxrPhArd5y6p8kzO0t8xIfMAe6yhztt6v2E-_Bb4Ec3GLFKikHSXNh5bI-gPrsI",
    "expires_in": 3599,
    "id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjkzNDFhYmM0MDkyYjZmYzAzOGU0MDNjOTEwMjJkZDNlNDQ1MzliNTYiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJhY2NvdW50cy5nb29nbGUuY29tIiwiYXpwIjoiNTM4MzQ0NjUzMjU1LTc1OGM1aDVpc2M0NXZnazI3ZDhoOGRlYWJvdnBnNnRvLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwiYXVkIjoiNTM4MzQ0NjUzMjU1LTc1OGM1aDVpc2M0NXZnazI3ZDhoOGRlYWJvdnBnNnRvLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwic3ViIjoiMTE3NzI2NDMxNjUxOTQzNjk4NjAwIiwiaGQiOiJnb29nbGUuY29tIiwiZW1haWwiOiJkYWJyaWFuQGdvb2dsZS5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiYXRfaGFzaCI6IkJBSW55TjN2MS1ZejNLQnJUMVo0ckEiLCJuYW1lIjoiQnJpYW4gRGF1Z2hlcnR5IiwicGljdHVyZSI6Imh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9hLS9BT2gxNEdnenAyTXNGRGZvbVdMX3VDemRYUWNzeVM3ZGtxTE5ybk90S0QzVXNRPXM5Ni1jIiwiZ2l2ZW5fbmFtZSI6IkJyaWFuIiwiZmFtaWx5X25hbWUiOiJEYXVnaGVydHkiLCJsb2NhbGUiOiJlbiIsImlhdCI6MTYzODk5MTYzOCwiZXhwIjoxNjM4OTk1MjM4LCJqdGkiOiI5YmRkZjE1YWFiNzE2ZDhjYmJmNDYwMmM1YWM3YzViN2VhMDQ5OTA5In0.K3EA-3Adw5HA7O8nJVCsX1HmGWxWzYk3P7ViVBb4H4BoT2-HIgxKlx1mi6jSxIUJGEekjw9MC-nL1B9Asgv1vXTMgoGaNna0UoEHYitySI23E5jaMkExkTSLtxI-ih2tJrA2ggfA9Ekj-JFiMc6MuJnwcfBTlsYWRcZOYVw3QpdTZ_VYfhUu-yERAElZCjaAyEXLtVQegRe-ymScra3r9S92TA33ylMb3WDTlfmDpWL0CDdDzby2asXYpl6GQ7SdSj64s49Yw6mdGELZn5WoJqG7Zr2KwIGXJuSxEo-wGbzxNK-mKAiABcFpYP4KHPEUgYyz3n9Vqn2Tfrgp-g65BQ",
    "session_state": {
      "extraQueryParams": {
        "authuser": "0"
      }
    },
    "first_issued_at": 1638991637982,
    "expires_at": 1638995236982,
    "idpId": "google"
  }

Google पहचान सेवाओं का क्रेडेंशियल

Google Identity सेवाएं लाइब्रेरी से ये चीज़ें मिलती हैं:

  • अनुमति पाने के लिए इस्तेमाल किए जाने पर, ऐक्सेस टोकन:
  {
    "access_token": "ya29.A0ARrdaM_LWSO-uckLj7IJVNSfnUityT0Xj-UCCrGxFQdxmLiWuAosnAKMVQ2Z0LLqeZdeJii3TgULp6hR_PJxnInBOl8UoUwWoqsrGQ7-swxgy97E8_hnzfhrOWyQBmH6zs0_sUCzwzhEr_FAVqf92sZZHphr0g",
    "token_type": "Bearer",
    "expires_in": 3599,
    "scope": "https://www.googleapis.com/auth/calendar.readonly"
  }
  • या, पुष्टि करने के लिए इस्तेमाल किए जाने वाले आईडी टोकन को:
  {
  "clientId": "538344653255-758c5h5isc45vgk27d8h8deabovpg6to.apps.googleusercontent.com",
  "credential": "eyJhbGciOiJSUzI1NiIsImtpZCI6ImMxODkyZWI0OWQ3ZWY5YWRmOGIyZTE0YzA1Y2EwZDAzMjcxNGEyMzciLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20iLCJuYmYiOjE2MzkxNTcyNjQsImF1ZCI6IjUzODM0NDY1MzI1NS03NThjNWg1aXNjNDV2Z2syN2Q4aDhkZWFib3ZwZzZ0by5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsInN1YiI6IjExNzcyNjQzMTY1MTk0MzY5ODYwMCIsIm5vbmNlIjoiZm9vYmFyIiwiaGQiOiJnb29nbGUuY29tIiwiZW1haWwiOiJkYWJyaWFuQGdvb2dsZS5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiYXpwIjoiNTM4MzQ0NjUzMjU1LTc1OGM1aDVpc2M0NXZnazI3ZDhoOGRlYWJvdnBnNnRvLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwibmFtZSI6IkJyaWFuIERhdWdoZXJ0eSIsInBpY3R1cmUiOiJodHRwczovL2xoMy5nb29nbGV1c2VyY29udGVudC5jb20vYS0vQU9oMTRHZ3pwMk1zRkRmb21XTF91Q3pkWFFjc3lTN2RrcUxOcm5PdEtEM1VzUT1zOTYtYyIsImdpdmVuX25hbWUiOiJCcmlhbiIsImZhbWlseV9uYW1lIjoiRGF1Z2hlcnR5IiwiaWF0IjoxNjM5MTU3NTY0LCJleHAiOjE2MzkxNjExNjQsImp0aSI6IjRiOTVkYjAyZjU4NDczMmUxZGJkOTY2NWJiMWYzY2VhYzgyMmI0NjUifQ.Cr-AgMsLFeLurnqyGpw0hSomjOCU4S3cU669Hyi4VsbqnAV11zc_z73o6ahe9Nqc26kPVCNRGSqYrDZPfRyTnV6g1PIgc4Zvl-JBuy6O9HhClAK1HhMwh1FpgeYwXqrng1tifmuotuLQnZAiQJM73Gl-J_6s86Buo_1AIx5YAKCucYDUYYdXBIHLxrbALsA5W6pZCqqkMbqpTWteix-G5Q5T8LNsfqIu_uMBUGceqZWFJALhS9ieaDqoxhIqpx_89QAr1YlGu_UO6R6FYl0wDT-nzjyeF5tonSs3FHN0iNIiR3AMOHZu7KUwZaUdHg4eYkU-sQ01QNY_11keHROCRQ",
  "select_by": "user"
  }

अमान्य टोकन का जवाब

समय-सीमा खत्म होने, रद्द किए जाने या अमान्य ऐक्सेस टोकन का इस्तेमाल करके एपीआई अनुरोध करने की कोशिश करने पर Google से मिले जवाब का उदाहरण:

एचटीटीपी रिस्पॉन्स हेडर

  www-authenticate: Bearer realm="https://accounts.google.com/", error="invalid_token"

जवाब का मुख्य हिस्सा

  {
    "error": {
      "code": 401,
      "message": "Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.",
      "errors": [
        {
          "message": "Invalid Credentials",
          "domain": "global",
          "reason": "authError",
          "location": "Authorization",
          "locationType": "header"
        }
      ],
      "status": "UNAUTHENTICATED"
    }
  }