Google Identity Services पर माइग्रेट करें

खास जानकारी

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

यह गाइड इन लाइब्रेरी से Google Identity Services लाइब्रेरी.

इस गाइड की मदद से, ये काम किए जा सकते हैं:

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

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

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

ऑथराइज़ेशन फ़्लो की पहचान करना

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

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

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

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

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

  • आपका लागू किया जाना इन पर आधारित होता है:

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

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

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

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

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

ऑथराइज़ेशन फ़्लो चुनें

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

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

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

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

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

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

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

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

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

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

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

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

यह सेक्शन उन बदलावों की समीक्षा करता है जो ब्राउज़र में मौजूद वेब ऐप्लिकेशन में तब किए जाते हैं, जब Google Identity Services की JavaScript लाइब्रेरी में माइग्रेट किया जा रहा है.

जिस कोड पर असर पड़ा है उसकी पहचान करना और टेस्टिंग

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

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

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

G_AUTH2_MIGRATION कुकी की संभावित वैल्यू:

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

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

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

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

अपने वेब ऐप्लिकेशन में Identity Services लाइब्रेरी को जोड़ें. इसके लिए, इसे अपने दस्तावेज़:

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

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

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

कुकी

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

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

क्रेडेंशियल

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

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

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

उपयोगकर्ता की प्रोफ़ाइल हटाकर, उसकी पुष्टि करने और उसे इस्तेमाल करने की अनुमति अलग करें ऑथराइज़ेशन फ़्लो से मैनेज करना.

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

तरीके

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

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

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

ऑब्जेक्ट:

  • TokenClientConfig के साथ gapi.auth2.AuthorizeConfig

तरीके:

  • google.accounts.oauth2.initTokenClient() के साथ gapi.auth2.init()

पैरामीटर:

  • gapi.auth2.AuthorizeConfig.login_hint के साथ TokenClientConfig.login_hint.
  • gapi.auth2.GoogleUser.getHostedDomain() में TokenClientConfig.hd की सदस्यता लें.

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

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

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

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

ऑब्जेक्ट:

  • gapi.auth2.AuthorizeConfig

तरीके:

  • gapi.auth2.init()

पैरामीटर:

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

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

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

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

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

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

तरीके:

  • TokenClient.requestAccessToken() के साथ gapi.auth2.authorize()
  • GoogleUser.reloadAuthResponse() के साथ TokenClient.requestAccessToken()

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

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

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

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

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

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

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

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

टोकन हैंडल करना

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

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

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

ऐक्सेस टोकन कम समय के लिए होते हैं. आम तौर पर, ये कुछ मिनट के लिए ही मान्य होते हैं.

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

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

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

तरीके:

  • google.accounts.oauth2.revoke() के साथ getAuthInstance().disconnect()
  • google.accounts.oauth2.revoke() के साथ GoogleUser.disconnect()

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

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

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

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

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

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

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

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

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

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

बदलें Google साइन-इन JavaScript क्लाइंट रेफ़रंस को Google से बदलें पहचान करने वाली सेवाएं:

ऑब्जेक्ट:

  • TokenClient.TokenResponse के साथ gapi.auth2.AuthorizeResponse
  • TokenClient.TokenResponse के साथ gapi.auth2.AuthResponse

तरीके:

  • GoogleUser.hasGrantedScopes() के साथ google.accounts.oauth2.hasGrantedAllScopes()
  • GoogleUser.getGrantedScopes() के साथ google.accounts.oauth2.hasGrantedAllScopes()

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

तरीके:

  • GoogleUser.getAuthResponse()

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

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

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

कोड इस्तेमाल करें में बताए गए चरणों का पालन करने के लिए, अपने प्लैटफ़ॉर्म को अपडेट करें अनुरोध की पुष्टि करने, ऐक्सेस टोकन पाने और रीफ़्रेश करने के लिए मॉडल गाइड टोकन.

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

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

पुराना तरीका

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 के 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 Identity सेवा की 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 Identity सेवा की लाइब्रेरी को जोड़ने का तरीका दिखाया गया है. टोकन मॉडल, gapi.auth2 मॉड्यूल हटाएं, और एपीआई को कॉल करने के लिए इसका इस्तेमाल करें: JavaScript के लिए Google API क्लाइंट लाइब्रेरी.

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

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

<!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 Identity सेवा की लाइब्रेरी को जोड़ने का तरीका दिखाया गया है. टोकन मॉडल, 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 a 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 Identity सेवा लाइब्रेरी के पॉप-अप उपयोगकर्ता अनुभव के लिए, यूआरएल रीडायरेक्ट का इस्तेमाल किया जा सकता है अपने बैकएंड टोकन एंडपॉइंट पर सीधे तौर पर ऑथराइज़ेशन कोड वापस करना चाहिए या उपयोगकर्ता के ब्राउज़र में चल रहा 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 Identity सेवा की 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=' + response.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 Identity Services, उपयोगकर्ता के लिए इस्तेमाल की जाने वाली 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 के ऑब्जेक्ट और तरीके की तुलना Client लाइब्रेरी और नई Google Identity Services लाइब्रेरी का इस्तेमाल कर सकते हैं और अतिरिक्त जानकारी और माइग्रेशन के दौरान की जाने वाली कार्रवाई के साथ नोट.

पुराना नए दर्शक नोट
GoogleAuth ऑब्जेक्ट और संबंधित तरीके:
GoogleAuth.attachClickHandler() हटाएं
GoogleAuth.currentUser.get() हटाएं
GoogleAuth.currentUser.listen() हटाएं
GoogleAuth.disconnect() google.accounts.oauth2.revoke पुराने को नए से बदलें. 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() or requestAccessToken() पुराने को नए से बदलें
GoogleUser.getBasicProfile() हटाएं पर टैप करें. इसके बजाय, आईडी टोकन का इस्तेमाल करें और 'Google साइन-इन' से डेटा दूसरी जगह भेजना देखें.
GoogleUser.getGrantedScopes() hasGrantedAnyScope() पुराने को नए से बदलें
GoogleUser.getHostedDomain() हटाएं
GoogleUser.getId() हटाएं
GoogleUser.grantOfflineAccess() हटाएं और ऑथराइज़ेशन कोड के फ़्लो का पालन करें.
GoogleUser.grant() हटाएं
GoogleUser.hasGrantedScopes() hasGrantedAnyScope() पुराने को नए से बदलें
GoogleUser.isSignedIn() हटाएं
GoogleUser.reloadAuthResponse() requestAccessToken() पुराना ऐक्सेस टोकन हटाएं, ऐक्सेस टोकन की समयसीमा खत्म हो चुकी है या निरस्त किए गए ऐक्सेस टोकन को बदलने के लिए नए को कॉल करें.
gapi.auth2 ऑब्जेक्ट और उससे जुड़े तरीके:
gapi.auth2.AuthorizeConfig ऑब्जेक्ट TokenClientConfig या CodeClientConfig पुराने को नए से बदलें
gapi.auth2.AuthorizeResponse ऑब्जेक्ट हटाएं
gapi.auth2.AuthResponse ऑब्जेक्ट हटाएं
gapi.auth2.authorize() requestCode() or requestAccessToken() पुराने को नए से बदलें
gapi.auth2.ClientConfig() TokenClientConfig या CodeClientConfig पुराने को नए से बदलें
gapi.auth2.getAuthInstance() हटाएं
gapi.auth2.init() initTokenClient() or initCodeClient() पुराने को नए से बदलें
gapi.auth2.offlineAccessOptions ऑब्जेक्ट हटाएं
gapi.auth2.SignInOptions ऑब्जेक्ट हटाएं
gapi.signin2 ऑब्जेक्ट और उससे जुड़े तरीके:
gapi.signin2.render() हटाएं पर टैप करें. HTML DOM लोडिंग g_id_signin या JS कॉल टू google.accounts.id.renderButton ट्रिगर करती है, जब कोई उपयोगकर्ता Google खाते में साइन-इन करता है.

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

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

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

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 Identity Services का क्रेडेंशियल

Google Identity Services लाइब्रेरी से यह जानकारी मिलती है:

  • जब अनुमति देने के लिए इस्तेमाल किया जाता है, तो ऐक्सेस टोकन होता है:

    {
      "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"
    }
  }