OAuth और Google साइन-इन के साथ सुव्यवस्थित लिंकिंग

अवलोकन

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

OAuth और Google साइन-इन के साथ खाता लिंक करने के लिए, इन सामान्य चरणों का पालन करें:

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

चित्रा 1। सुव्यवस्थित लिंकिंग के साथ उपयोगकर्ता के फ़ोन पर खाता लिंक करना

सुव्यवस्थित लिंकिंग के लिए आवश्यकताएँ

अपना OAuth सर्वर लागू करें

आपका टोकन विनिमय endpoint का समर्थन करना चाहिए check , create , get उद्देश्य। नीचे खाता लिंकिंग प्रवाह के माध्यम से पूर्ण किए गए चरणों को दिखाता है और इंगित करता है कि अलग-अलग इरादों को कब कहा जाता है:

  1. क्या आपके प्रमाणीकरण प्रणाली में उपयोगकर्ता का खाता है? (उपयोगकर्ता हाँ या नहीं का चयन करके निर्णय लेता है)
    1. हाँ : क्या उपयोगकर्ता आपके प्लेटफ़ॉर्म में साइन इन करने के लिए अपने Google खाते से संबद्ध ईमेल का उपयोग करता है? (उपयोगकर्ता हाँ या नहीं का चयन करके निर्णय लेता है)
      1. हाँ : क्या आपके प्रमाणीकरण प्रणाली में उपयोगकर्ता का मिलान खाता है? ( check intent की पुष्टि करने के लिए कहा जाता है)
        1. हाँ: get intent कहा जाता है और अगर इरादे रिटर्न सफलतापूर्वक प्राप्त खाता लिंक है।
        2. नहीं: नया खाता बनाएं? (उपयोगकर्ता हाँ या नहीं का चयन करके निर्णय लेता है)
          1. हाँ: create intent कहा जाता है और अगर सफलतापूर्वक आशय रिटर्न बनाने खाता लिंक है।
          2. नहीं: वेब OAuth प्रवाह ट्रिगर होता है, उपयोगकर्ता को उनके ब्राउज़र पर निर्देशित किया जाता है, और उपयोगकर्ता को एक अलग ईमेल से लिंक करने का विकल्प दिया जाता है।
      2. सं: वेब OAuth प्रवाह शुरू हो रहा है, उपयोगकर्ता अपने ब्राउज़र को निर्देश दिया है, और उपयोगकर्ता एक अलग ईमेल के साथ लिंक करने का विकल्प दिया जाता है।
    2. नहीं : क्या आपके प्रमाणीकरण प्रणाली में उपयोगकर्ता का मिलान खाता है? ( check intent की पुष्टि करने के लिए कहा जाता है)
      1. हाँ: get intent कहा जाता है और अगर इरादे रिटर्न सफलतापूर्वक प्राप्त खाता लिंक है।
      2. सं: create intent कहा जाता है और अगर सफलतापूर्वक आशय रिटर्न बनाने खाता लिंक है।

मौजूदा उपयोगकर्ता खाते की जांच करें (इरादे की जांच करें)

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

इसी Google खाते अपनी प्रमाणीकरण प्रणाली में पहले से ही मौजूद न हो, के साथ अपने टोकन विनिमय endpoint प्रतिक्रिया account_found=true । Google खाते में किसी मौजूदा उपयोगकर्ता से मेल नहीं खाता, तो आपका टोकन विनिमय endpoint के साथ एक HTTP 404 नहीं मिला त्रुटि देता है account_found=false

अनुरोध में निम्नलिखित रूप है:

POST /token HTTP/1.1
Host: oauth2.example.com
Content-Type: application/x-www-form-urlencoded

grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&intent=check&assertion=JWT&scope=SCOPES

आपका टोकन एक्सचेंज एंडपॉइंट निम्नलिखित मापदंडों को संभालने में सक्षम होना चाहिए:

टोकन समापन बिंदु पैरामीटर
intent इन अनुरोधों के लिए, इस पैरामीटर का मान है check
grant_type टोकन के प्रकार का आदान-प्रदान किया जा रहा है। इन अनुरोधों के लिए, इस पैरामीटर मान है urn:ietf:params:oauth:grant-type:jwt-bearer
assertion एक JSON वेब टोकन (JWT) जो Google उपयोगकर्ता की पहचान का एक हस्ताक्षरित अभिकथन प्रदान करता है। JWT में ऐसी जानकारी होती है जिसमें उपयोगकर्ता का Google खाता आईडी, नाम और ईमेल पता शामिल होता है।

के लिए प्रतिक्रिया करने check के इरादे अनुरोध आपका टोकन विनिमय समाप्ति बिंदु निम्न चरणों का पालन करना होगा:

  • JWT अभिकथन को मान्य और डिकोड करें।
  • जांचें कि क्या Google खाता आपके प्रमाणीकरण प्रणाली में पहले से मौजूद है।
验证并解码JWT断言

您可以使用针对您的语言JWT解码库来验证和解码JWT断言。使用Google的JWKPEM格式的公钥来验证令牌的签名。

解码后,JWT断言类似于以下示例:

{
  "sub": "1234567890",      // The unique ID of the user's Google Account
  "iss": "https://accounts.google.com",        // The assertion's issuer
  "aud": "123-abc.apps.googleusercontent.com", // Your server's client ID
  "iat": 233366400,         // Unix timestamp of the assertion's creation time
  "exp": 233370000,         // Unix timestamp of the assertion's expiration time
  "name": "Jan Jansen",
  "given_name": "Jan",
  "family_name": "Jansen",
  "email": "jan@gmail.com", // If present, the user's email address
  "email_verified": true,   // true, if Google has verified the email address
  "hd": "example.com",      // If present, the host domain of the user's GSuite email address
                            // If present, a URL to user's profile picture
  "picture": "https://lh3.googleusercontent.com/a-/AOh14GjlTnZKHAeb94A-FmEbwZv7uJD986VOF1mJGb2YYQ",
  "locale": "en_US"         // User's locale, from browser or phone settings
}

除了验证令牌的签名外,还要验证断言的颁发者( iss字段)为https://accounts.google.com ,受众( aud字段)是您分配的客户端ID,并且令牌尚未过期( exp场地)。

使用emailemail_verifiedhd字段,您可以确定Google是否托管电子邮件地址并对其具有权威性。如果Google具有权威性,则当前已知该用户为合法帐户所有者,您可以跳过密码或其他挑战方法。否则,可以使用这些方法在链接之前验证帐户。

Google具有权威性的情况:

  • email后缀为@gmail.com ,这是一个Gmail帐户。
  • email_verified为true并且设置了hd ,这是一个G Suite帐户。

用户可以在不使用Gmail或G Suite的情况下注册Google帐户。如果email不包含@gmail.com后缀,并且没有hd则Google并不具有权威性,建议您使用密码或其他验证方法来验证用户。当Google在创建Google帐户时最初验证了用户时, email_verfied也可能为true,但是此后第三方电子邮件帐户的所有权可能已更改。

जांचें कि क्या Google खाता आपके प्रमाणीकरण सिस्टम में पहले से मौजूद है

जांचें कि क्या निम्न में से कोई भी स्थिति सत्य है:

  • Google खाता आईडी, दावे के में पाया sub क्षेत्र, अपने उपयोगकर्ता डेटाबेस में है।
  • अभिकथन में ईमेल पता आपके उपयोगकर्ता डेटाबेस में एक उपयोगकर्ता से मेल खाता है।

यदि कोई भी शर्त सत्य है, तो उपयोगकर्ता पहले ही साइन अप कर चुका है। उस स्थिति में, निम्न की तरह प्रतिक्रिया लौटाएं:

HTTP/1.1 200 Success
Content-Type: application/json;charset=UTF-8

{
  "account_found":"true",
}

यदि न तो Google खाता आईडी और न ही अभिकथन में निर्दिष्ट ईमेल पता आपके डेटाबेस के किसी उपयोगकर्ता से मेल खाता है, तो उपयोगकर्ता ने अभी तक साइन अप नहीं किया है। इस मामले में, अपने टोकन विनिमय endpoint एक HTTP 404 त्रुटि है कि निर्दिष्ट करता है जवाब देने के लिए की जरूरत है "account_found": "false" , निम्न उदाहरण में:

HTTP/1.1 404 Not found
Content-Type: application/json;charset=UTF-8

{
  "account_found":"false",
}

处理自动链接(获取意图)

在用户同意访问其 Google 个人资料后,Google 会发送一个请求,其中包含对 Google 用户身份的签名声明。该断言包含的信息包括用户的 Google 帐户 ID、姓名和电子邮件地址。为您的项目配置的令牌交换端点处理该请求。

如果您的身份验证系统中已存在相应的 Google 帐户,则您的令牌交换端点会为用户返回一个令牌。如果谷歌帐户没有现有用户相匹配,您的令牌交换终结返回linking_error错误和可选login_hint

该请求具有以下形式:

POST /token HTTP/1.1
Host: oauth2.example.com
Content-Type: application/x-www-form-urlencoded

grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&intent=get&assertion=JWT&scope=SCOPES

您的令牌交换端点必须能够处理以下参数:

令牌端点参数
intent对于这些请求,这个参数的值是get
grant_type正在交换的令牌类型。对于这些请求,这个参数的值是urn:ietf:params:oauth:grant-type:jwt-bearer
assertion一个 JSON Web 令牌 (JWT),它提供了对 Google 用户身份的签名断言。 JWT 包含的信息包括用户的 Google 帐户 ID、姓名和电子邮件地址。
scope可选:任何作用域,你已经配置了谷歌从用户的请求。

要在响应get意图的要求,你的令牌交换,端点必须执行以下步骤:

  • 验证和解码 JWT 断言。
  • 检查 Google 帐户是否已存在于您的身份验证系统中。
验证并解码JWT断言

您可以使用针对您的语言JWT解码库来验证和解码JWT断言。使用Google的JWKPEM格式的公钥来验证令牌的签名。

解码后,JWT断言类似于以下示例:

{
  "sub": "1234567890",      // The unique ID of the user's Google Account
  "iss": "https://accounts.google.com",        // The assertion's issuer
  "aud": "123-abc.apps.googleusercontent.com", // Your server's client ID
  "iat": 233366400,         // Unix timestamp of the assertion's creation time
  "exp": 233370000,         // Unix timestamp of the assertion's expiration time
  "name": "Jan Jansen",
  "given_name": "Jan",
  "family_name": "Jansen",
  "email": "jan@gmail.com", // If present, the user's email address
  "email_verified": true,   // true, if Google has verified the email address
  "hd": "example.com",      // If present, the host domain of the user's GSuite email address
                            // If present, a URL to user's profile picture
  "picture": "https://lh3.googleusercontent.com/a-/AOh14GjlTnZKHAeb94A-FmEbwZv7uJD986VOF1mJGb2YYQ",
  "locale": "en_US"         // User's locale, from browser or phone settings
}

除了验证令牌的签名外,还要验证断言的颁发者( iss字段)为https://accounts.google.com ,受众( aud字段)是您分配的客户端ID,并且令牌尚未过期( exp场地)。

使用emailemail_verifiedhd字段,您可以确定Google是否托管电子邮件地址并对其具有权威性。如果Google具有权威性,则当前已知该用户为合法帐户所有者,您可以跳过密码或其他挑战方法。否则,可以使用这些方法在链接之前验证帐户。

Google具有权威性的情况:

  • email后缀为@gmail.com ,这是一个Gmail帐户。
  • email_verified为true并且设置了hd ,这是一个G Suite帐户。

用户可以在不使用Gmail或G Suite的情况下注册Google帐户。如果email不包含@gmail.com后缀,并且没有hd则Google并不具有权威性,建议您使用密码或其他验证方法来验证用户。当Google在创建Google帐户时最初验证了用户时, email_verfied也可能为true,但是此后第三方电子邮件帐户的所有权可能已更改。

检查您的身份验证系统中是否已存在 Google 帐户

检查是否满足以下任一条件:

  • 该谷歌帐户ID,在断言的发现sub场,是在你的用户数据库。
  • 断言中的电子邮件地址与用户数据库中的用户匹配。

如果发现用户的账号,发出的访问令牌,并在您的HTTPS响应的主体在下面的例子中JSON对象返回的值,比如:

{
  "token_type": "Bearer",
  "access_token": "ACCESS_TOKEN",

  "expires_in": SECONDS_TO_EXPIRATION
}

在某些情况下,用户基于 ID 令牌的帐户链接可能会失败。如果它这样做以任何理由,你的令牌交换端点需要用HTTP回复401错误指定error=linking_error ,如下例所示:

HTTP/1.1 401 Unauthorized
Content-Type: application/json;charset=UTF-8

{
  "error":"linking_error",
  "login_hint":"foo@bar.com"
}

当谷歌收到401错误响应linking_error ,谷歌会将用户带到你的授权端点login_hint作为参数。用户使用浏览器中的 OAuth 链接流程完成帐户链接。

通过 Google 登录处理帐户创建(创建意图)

当用户需要在您的服务上创建帐户时,Google 会向您的令牌交换端点发出请求,指定intent=create

该请求具有以下形式:

POST /token HTTP/1.1
Host: oauth2.example.com
Content-Type: application/x-www-form-urlencoded

response_type=token&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&scope=SCOPES&intent=create&assertion=JWT

您的令牌交换端点必须能够处理以下参数:

令牌端点参数
intent对于这些请求,此参数的值为create
grant_type正在交换的令牌类型。对于这些请求,此参数的值为urn:ietf:params:oauth:grant-type:jwt-bearer
assertion一个 JSON Web 令牌 (JWT),它提供了对 Google 用户身份的签名断言。 JWT 包含的信息包括用户的 Google 帐户 ID、姓名和电子邮件地址。

assertion参数中的 JWT 包含用户的 Google 帐户 ID、姓名和电子邮件地址,您可以使用它们在您的服务上创建新帐户。

要响应create意图请求,您的令牌交换端点必须执行以下步骤:

  • 验证和解码 JWT 断言。
  • 验证用户信息并创建新帐户。
验证并解码JWT断言

您可以使用针对您的语言JWT解码库来验证和解码JWT断言。使用Google的JWKPEM格式的公钥来验证令牌的签名。

解码后,JWT断言类似于以下示例:

{
  "sub": "1234567890",      // The unique ID of the user's Google Account
  "iss": "https://accounts.google.com",        // The assertion's issuer
  "aud": "123-abc.apps.googleusercontent.com", // Your server's client ID
  "iat": 233366400,         // Unix timestamp of the assertion's creation time
  "exp": 233370000,         // Unix timestamp of the assertion's expiration time
  "name": "Jan Jansen",
  "given_name": "Jan",
  "family_name": "Jansen",
  "email": "jan@gmail.com", // If present, the user's email address
  "email_verified": true,   // true, if Google has verified the email address
  "hd": "example.com",      // If present, the host domain of the user's GSuite email address
                            // If present, a URL to user's profile picture
  "picture": "https://lh3.googleusercontent.com/a-/AOh14GjlTnZKHAeb94A-FmEbwZv7uJD986VOF1mJGb2YYQ",
  "locale": "en_US"         // User's locale, from browser or phone settings
}

除了验证令牌的签名外,还要验证断言的颁发者( iss字段)为https://accounts.google.com ,受众( aud字段)是您分配的客户端ID,并且令牌尚未过期( exp场地)。

使用emailemail_verifiedhd字段,您可以确定Google是否托管电子邮件地址并对其具有权威性。如果Google具有权威性,则当前已知该用户为合法帐户所有者,您可以跳过密码或其他挑战方法。否则,可以使用这些方法在链接之前验证帐户。

Google具有权威性的情况:

  • email后缀为@gmail.com ,这是一个Gmail帐户。
  • email_verified为true并且设置了hd ,这是一个G Suite帐户。

用户可以在不使用Gmail或G Suite的情况下注册Google帐户。如果email不包含@gmail.com后缀,并且没有hd则Google并不具有权威性,建议您使用密码或其他验证方法来验证用户。当Google在创建Google帐户时最初验证了用户时, email_verfied也可能为true,但是此后第三方电子邮件帐户的所有权可能已更改。

验证用户信息并创建新帐户

检查是否满足以下任一条件:

  • 在断言的sub字段中找到的 Google 帐户 ID 位于您的用户数据库中。
  • 断言中的电子邮件地址与用户数据库中的用户匹配。

如果任一条件为真,则提示用户将其现有帐户与其 Google 帐户相关联。为此,请使用 HTTP 401 错误响应请求,指定error=linking_error并将用户的电子邮件地址作为login_hint 。以下是示例响应:

HTTP/1.1 401 Unauthorized
Content-Type: application/json;charset=UTF-8

{
  "error":"linking_error",
  "login_hint":"foo@bar.com"
}

当 Google 收到带有linking_error的 401 错误响应时,Google 会将用户发送到您的授权端点, login_hint作为参数。用户使用浏览器中的 OAuth 链接流程完成帐户链接。

如果两个条件都不成立,请使用 JWT 中提供的信息创建一个新用户帐户。新帐户通常没有设置密码。建议您将 Google Sign-In 添加到其他平台,以使用户能够通过您的应用程序界面使用 Google 登录。或者,您可以通过电子邮件向用户发送启动密码恢复流程的链接,以允许用户设置密码以在其他平台上登录。

创建完成后,发出访问令牌 并在 HTTPS 响应的正文中返回 JSON 对象中的值,如下例所示:

{
  "token_type": "Bearer",
  "access_token": "ACCESS_TOKEN",

  "expires_in": SECONDS_TO_EXPIRATION
}

अपना Google API क्लाइंट आईडी प्राप्त करें

आप खाता लिंकिंग के दौरान अपने Google API क्लाइंट आईडी प्रदान करने के लिए आवश्यक हो जाएगा पंजीकरण प्रक्रिया।

परियोजना को पूरा करने, जबकि आपके द्वारा बनाए गए का उपयोग कर अपने एपीआई ग्राहक आईडी प्राप्त करने के लिए OAuth लिंकिंग चरणों। ऐसा करने के लिए, निम्नलिखित चरणों को पूरा करें:

  1. की साख पृष्ठ खोलें Google API कंसोल
  2. Google API प्रोजेक्ट बनाएं या चुनें।

    अपनी परियोजना वेब अनुप्रयोग प्रकार के लिए एक ग्राहक आईडी नहीं है, तो, साख बनाएं पर क्लिक करें> OAuth क्लाइंट आईडी एक बनाने के लिए। में अधिकृत जावास्क्रिप्ट मूल बॉक्स आपकी साइट के डोमेन शामिल करना न भूलें। जब आप स्थानीय परीक्षण या विकास करते हैं, आप जोड़ना आवश्यक दोनों http://localhost और http://localhost:<port_number> अधिकृत जावास्क्रिप्ट मूल क्षेत्र के लिए।

आपके कार्यान्वयन को मान्य करना

您可以通过使用验证实现的OAuth 2.0游乐场工具。

在工具中,执行以下步骤:

  1. 单击配置打开的OAuth 2.0配置窗口。
  2. OAuth流场中,选择客户端
  3. OAuth端点字段中,选择自定义
  4. 在相应字段中指定您的 OAuth 2.0 端点和您分配给 Google 的客户端 ID。
  5. 步骤1部分,不要选择任何谷歌范围。相反,将此字段留空或键入对您的服务器有效的范围(如果不使用 OAuth 范围,则输入任意字符串)。当您完成后,单击授权的API。
  6. 步骤2步骤3段,完成OAuth 2.0流程和验证每个步骤按预期工作。

您可以通过验证您的实现谷歌帐户链接演示工具。

在工具中,执行以下步骤:

  1. 点击登录在与谷歌按钮。
  2. 选择您要关联的帐户。
  3. 输入服务标识。
  4. (可选)输入您将请求访问的一个或多个范围。
  5. 单击开始演示
  6. 出现提示时,确认您可以同意并拒绝链接请求。
  7. 确认您被重定向到您的平台。