Vinculación optimizada con OAuth y el inicio de sesión de Google

Descripción general

Basada en OAuth vinculación de sesión de Google optimizada añade acceso de Google en la parte superior de OAuth vinculación . Esto proporciona una experiencia de vinculación perfecta para los usuarios de Google y también permite la creación de cuentas, lo que permite al usuario crear una nueva cuenta en su servicio utilizando su cuenta de Google.

Para realizar la vinculación de cuentas con OAuth y Google Sign-In, siga estos pasos generales:

  1. En primer lugar, pide al usuario que dé su consentimiento para acceder a su perfil de Google.
  2. Utilice la información de su perfil para comprobar si existe la cuenta de usuario.
  3. Para los usuarios existentes, vincule las cuentas.
  4. Si no puede encontrar una coincidencia para el usuario de Google en su sistema de autenticación, valide el token de identificación recibido de Google. Luego puede crear un usuario basado en la información de perfil contenida en el token de ID.
Esta figura muestra los pasos para que un usuario vincule su cuenta de Google mediante el flujo de vinculación simplificado. La primera captura de pantalla muestra cómo un usuario puede seleccionar su aplicación para vincularla. La segunda captura de pantalla le permite al usuario confirmar si tiene o no una cuenta existente en su servicio. La tercera captura de pantalla le permite al usuario seleccionar la cuenta de Google con la que desea vincularse. La cuarta captura de pantalla muestra la confirmación de vincular su cuenta de Google con su aplicación. La quinta captura de pantalla muestra una cuenta de usuario vinculada con éxito en la aplicación de Google.

Figura 1. Vinculación de cuentas en el teléfono de un usuario con vinculación optimizada

Requisitos para la vinculación optimizada

Implementa tu servidor OAuth

Su punto final Cambio de Ficha debe ser compatible con el check , create , get intenciones. A continuación, se muestran los pasos completados a través del flujo de vinculación de cuentas e indica cuándo se llaman las diferentes intenciones:

  1. ¿El usuario tiene una cuenta en su sistema de autenticación? (El usuario decide seleccionando SI o NO)
    1. SÍ: ¿El usuario utiliza el correo electrónico asociado a su cuenta de Google para iniciar sesión en su plataforma? (El usuario decide seleccionando SI o NO)
      1. SÍ: ¿Tiene el usuario una cuenta coincidente en su sistema de autenticación? ( check intent está llamado a confirmar)
        1. SÍ: get intent que se llama y la cuenta está vinculada si la intención obtener retornos con éxito.
        2. NO: ¿Crear nueva cuenta? (El usuario decide seleccionando SI o NO)
          1. SÍ: create intent que se llama y la cuenta está vinculada si la intención de crear rendimientos éxito.
          2. NO: se activa el flujo de Web OAuth, se dirige al usuario a su navegador y se le da la opción de vincularse con un correo electrónico diferente.
      2. NO: El flujo de OAuth Web se activa, el usuario es dirigido a su navegador, y el usuario tiene la opción de enlace con un correo electrónico diferente.
    2. NO: ¿Tiene el usuario una cuenta coincidente en su sistema de autenticación? ( check intent está llamado a confirmar)
      1. SÍ: get intent que se llama y la cuenta está vinculada si la intención obtener retornos con éxito.
      2. Nº: create intent que se llama y la cuenta está vinculada si la intención de crear rendimientos éxito.

检查现有用户帐户(检查意图)

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

如果您的身份验证系统中已经存在相应的 Google 帐户,则您的令牌交换端点会以account_found=true进行响应。如果 Google 帐户与现有用户不匹配,您的令牌交换端点会返回 HTTP 404 Not Found 错误,并带有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 Web 令牌 (JWT),它提供了对 Google 用户身份的签名断言。 JWT 包含的信息包括用户的 Google 帐户 ID、姓名和电子邮件地址。

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

  • 验证和解码 JWT 断言。
  • 检查 Google 帐户是否已存在于您的身份验证系统中。
Validar y decodificar la aserción JWT

Puede validar y decodificar la aserción JWT utilizando una biblioteca de decodificación JWT para su idioma . Utilice las claves públicas de Google, disponibles en formatos JWK o PEM , para verificar la firma del token.

Cuando se decodifica, la aserción JWT se parece al siguiente ejemplo:

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

Además de verificar la firma del token, verifique que el emisor de la afirmación (campo iss ) sea https://accounts.google.com , que la audiencia (campo aud ) sea su ID de cliente asignado y que el token no haya caducado ( exp campo).

Con los campos email , email_verified y hd puede determinar si Google aloja y tiene autoridad para una dirección de correo electrónico. En los casos en que Google tiene autoridad, se sabe que el usuario es el propietario legítimo de la cuenta y puede omitir la contraseña u otros métodos de desafío. De lo contrario, estos métodos se pueden utilizar para verificar la cuenta antes de vincularla.

Casos en los que Google tiene autoridad:

  • email tiene un sufijo @gmail.com , esta es una cuenta de Gmail.
  • email_verified es verdadero y hd está configurado, esta es una cuenta de G Suite.

Los usuarios pueden registrarse para obtener cuentas de Google sin usar Gmail o G Suite. Cuando el email no contiene un sufijo @gmail.com y no hay hd Google no tiene autoridad y se recomienda utilizar una contraseña u otros métodos de desafío para verificar al usuario. email_verfied también puede ser cierto ya que Google verificó inicialmente al usuario cuando se creó la cuenta de Google, sin embargo, la propiedad de la cuenta de correo electrónico de terceros puede haber cambiado desde entonces.

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

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

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

如果任一条件为真,则用户已经注册。在这种情况下,返回如下响应:

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

{
  "account_found":"true",
}

如果断言中指定的 Google 帐户 ID 和电子邮件地址都不匹配您数据库中的用户,则该用户尚未注册。在这种情况下,您的令牌交换端点需要回复一个 HTTP 404 错误,指定"account_found": "false" ,如以下示例所示:

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

{
  "account_found":"false",
}

Handle automatic linking (get intent)

After the user gives consent to access their Google profile, Google sends a request that contains a signed assertion of the Google user's identity. The assertion contains information that includes the user's Google Account ID, name, and email address. The token exchange endpoint configured for your project handles that request.

If the corresponding Google Account is already present in your authentication system, your token exchange endpoint returns a token for the user. If the Google Account doesn't match an existing user, your token exchange endpoint returns a linking_error error and optional login_hint.

The request has the following form:

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

Your token exchange endpoint must be able to handle the following parameters:

Token endpoint parameters
intent For these requests, the value of this parameter is get.
grant_type The type of token being exchanged. For these requests, this parameter has the value urn:ietf:params:oauth:grant-type:jwt-bearer.
assertion A JSON Web Token (JWT) that provides a signed assertion of the Google user's identity. The JWT contains information that includes the user's Google Account ID, name, and email address.
scope Optional: Any scopes that you've configured Google to request from users.

To respond to the get intent requests, your token exchange endpoint must perform the following steps:

  • Validate and decode the JWT assertion.
  • Check if the Google account is already present in your authentication system.
Validar y decodificar la aserción JWT

Puede validar y decodificar la aserción JWT utilizando una biblioteca de decodificación JWT para su idioma . Utilice las claves públicas de Google, disponibles en formatos JWK o PEM , para verificar la firma del token.

Cuando se decodifica, la aserción JWT se parece al siguiente ejemplo:

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

Además de verificar la firma del token, verifique que el emisor de la afirmación (campo iss ) sea https://accounts.google.com , que la audiencia (campo aud ) sea su ID de cliente asignado y que el token no haya caducado ( exp campo).

Con los campos email , email_verified y hd puede determinar si Google aloja y tiene autoridad para una dirección de correo electrónico. En los casos en que Google tiene autoridad, se sabe que el usuario es el propietario legítimo de la cuenta y puede omitir la contraseña u otros métodos de desafío. De lo contrario, estos métodos se pueden utilizar para verificar la cuenta antes de vincularla.

Casos en los que Google tiene autoridad:

  • email tiene un sufijo @gmail.com , esta es una cuenta de Gmail.
  • email_verified es verdadero y hd está configurado, esta es una cuenta de G Suite.

Los usuarios pueden registrarse para obtener cuentas de Google sin usar Gmail o G Suite. Cuando el email no contiene un sufijo @gmail.com y no hay hd Google no tiene autoridad y se recomienda utilizar una contraseña u otros métodos de desafío para verificar al usuario. email_verfied también puede ser cierto ya que Google verificó inicialmente al usuario cuando se creó la cuenta de Google, sin embargo, la propiedad de la cuenta de correo electrónico de terceros puede haber cambiado desde entonces.

Check if the Google account is already present in your authentication system

Check whether either of the following conditions are true:

  • The Google Account ID, found in the assertion's sub field, is in your user database.
  • The email address in the assertion matches a user in your user database.

If an account is found for the user, issue an access token and return the values in a JSON object in the body of your HTTPS response, like in the following example:

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

  "expires_in": SECONDS_TO_EXPIRATION
}

In some cases, account linking based on ID token might fail for the user. If it does so for any reason, your token exchange endpoint needs to reply with a HTTP 401 error that specifies error=linking_error, as the following example shows:

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

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

When Google receives a 401 error response with linking_error, Google sends the user to your authorization endpoint with login_hint as a parameter. The user completes account linking using the OAuth linking flow in their browser.

通过 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 断言。
  • 验证用户信息并创建新帐户。
Validar y decodificar la aserción JWT

Puede validar y decodificar la aserción JWT utilizando una biblioteca de decodificación JWT para su idioma . Utilice las claves públicas de Google, disponibles en formatos JWK o PEM , para verificar la firma del token.

Cuando se decodifica, la aserción JWT se parece al siguiente ejemplo:

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

Además de verificar la firma del token, verifique que el emisor de la afirmación (campo iss ) sea https://accounts.google.com , que la audiencia (campo aud ) sea su ID de cliente asignado y que el token no haya caducado ( exp campo).

Con los campos email , email_verified y hd puede determinar si Google aloja y tiene autoridad para una dirección de correo electrónico. En los casos en que Google tiene autoridad, se sabe que el usuario es el propietario legítimo de la cuenta y puede omitir la contraseña u otros métodos de desafío. De lo contrario, estos métodos se pueden utilizar para verificar la cuenta antes de vincularla.

Casos en los que Google tiene autoridad:

  • email tiene un sufijo @gmail.com , esta es una cuenta de Gmail.
  • email_verified es verdadero y hd está configurado, esta es una cuenta de G Suite.

Los usuarios pueden registrarse para obtener cuentas de Google sin usar Gmail o G Suite. Cuando el email no contiene un sufijo @gmail.com y no hay hd Google no tiene autoridad y se recomienda utilizar una contraseña u otros métodos de desafío para verificar al usuario. email_verfied también puede ser cierto ya que Google verificó inicialmente al usuario cuando se creó la cuenta de Google, sin embargo, la propiedad de la cuenta de correo electrónico de terceros puede haber cambiado desde entonces.

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

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

  • 在断言的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
}

Obtenga su ID de cliente de la API de Google

Se le pedirá que proporcione su ID de Google API de cliente durante el enlace de cuentas de registro de proceso.

Para obtener su API ID de cliente utilizando el proyecto que ha creado al completar los OAuth Linking pasos. Para hacerlo, complete los siguientes pasos:

  1. Abra la página Credenciales de la consola de API de Google .
  2. Cree o seleccione un proyecto de API de Google.

    Si el proyecto no tiene un ID de cliente para el tipo de aplicación Web, haga clic en Crear credenciales> OAuth ID de cliente para crear una. Asegúrese de incluir el dominio de su sitio en el palco de los orígenes de JavaScript autorizados. Al realizar pruebas o desarrollo locales, debe agregar tanto http://localhost y http://localhost:<port_number> al campo orígenes JavaScript autorizado.

Validando su implementación

您可以通过使用验证实现的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. 确认您被重定向到您的平台。