Descripción general
La vinculación optimizada basada en OAuth de Acceder con Google agrega Acceder con Google a la vinculación de OAuth. Esto proporciona una experiencia de vinculación fluida para los usuarios de Google y también permite la creación de cuentas, lo que permite que el usuario cree una cuenta nueva en tu servicio con su Cuenta de Google.
Para vincular cuentas con OAuth y Acceder con Google, sigue estos pasos generales:
- Primero, pídele al usuario que otorgue su consentimiento para acceder a su perfil de Google.
- Usa la información de su perfil para verificar si existe la cuenta de usuario.
- En el caso de los usuarios existentes, vincula las cuentas.
- Si no encuentras una coincidencia para el usuario de Google en tu sistema de autenticación, valida el token de ID que recibiste de Google. Luego, puedes crear un usuario en función de la información del perfil que contiene el token de ID.
Figura 1. Vinculación de cuentas en el teléfono de un usuario con la vinculación optimizada
Requisitos para la vinculación simplificada
- Implementa el flujo de vinculación básica de OAuth web. Tu servicio debe admitir extremos de autorización y de intercambio de tokens que cumplan con OAuth 2.0.
- Tu extremo de intercambio de tokens debe admitir aserciones de tokens web JSON (JWT) y, además, implementar las intenciones
check,createyget.
Implementa tu servidor de OAuth
Tu extremo de intercambio de tokens debe admitir las intenciones check, create y get.
Sigue estos pasos para completar el flujo de vinculación de cuentas y saber cuándo se usan los diferentes intents:
- ¿El usuario tiene una cuenta en tu sistema de autenticación? (El usuario decide seleccionando SÍ o NO)
- SÍ: ¿El usuario usa el correo electrónico asociado a su Cuenta de Google para acceder a tu plataforma? (El usuario decide seleccionando SÍ o NO)
- SÍ: ¿El usuario tiene una cuenta coincidente en tu sistema de autenticación? (Se llama a
check intentpara confirmar).- SÍ : Se llama a
get intenty se vincula la cuenta si el intent de obtención se devuelve correctamente. - NO: ¿Crear una cuenta nueva? (El usuario decide seleccionando SÍ o NO)
- SÍ : Se llama a
create intenty se vincula la cuenta si la intención de creación se devuelve correctamente. - NO : Se activa el flujo de OAuth web, se dirige al usuario a su navegador y se le da la opción de vincularse con un correo electrónico diferente.
- SÍ : Se llama a
- SÍ : Se llama a
- NO : Se activa el flujo de OAuth web, se dirige al usuario a su navegador y se le da la opción de vincularse con un correo electrónico diferente.
- SÍ: ¿El usuario tiene una cuenta coincidente en tu sistema de autenticación? (Se llama a
- NO: ¿El usuario tiene una cuenta coincidente en tu sistema de autenticación? (Se llama a
check intentpara confirmar).- SÍ : Se llama a
get intenty se vincula la cuenta si el intent de obtención se devuelve correctamente. - NO : Se llama a
create intenty se vincula la cuenta si el intent de creación se devuelve correctamente.
- SÍ : Se llama a
- SÍ: ¿El usuario usa el correo electrónico asociado a su Cuenta de Google para acceder a tu plataforma? (El usuario decide seleccionando SÍ o NO)
Cómo comprobar si hay una cuenta de usuario existente (verificar intención)
Una vez que el usuario da su consentimiento para acceder a su perfil de Google, Google envía un solicitud que incluya una aserción firmada de la identidad del usuario de Google. El contiene información que incluye el ID de la Cuenta de Google del usuario, y tu dirección de correo electrónico. El extremo de intercambio de tokens configurado para tu el proyecto se encargará de esa solicitud.
Si la Cuenta de Google correspondiente ya está presente en tu autenticación
de intercambio de tokens, tu extremo de intercambio de tokens responde con account_found=true. Si el botón
La Cuenta de Google no coincide con un usuario existente, tu extremo de intercambio de token
muestra un error HTTP 404 No encontrado con account_found=false.
La solicitud tiene el siguiente formato:
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&client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET
El extremo de intercambio de tokens debe ser capaz de controlar los siguientes parámetros:
| Parámetros de extremo del token | |
|---|---|
intent |
Para estas solicitudes, el valor de este parámetro es
check |
grant_type |
El tipo de token que se intercambia. Para estas solicitudes, este
tiene el valor urn:ietf:params:oauth:grant-type:jwt-bearer. |
assertion |
Un token web JSON (JWT) que proporciona una aserción firmada del token de Google la identidad del usuario. El JWT contiene información que incluye los datos ID, nombre y dirección de correo electrónico de la Cuenta de Google. |
client_id |
El ID de cliente que le asignaste a Google |
client_secret |
El secreto de cliente que asignaste a Google. |
Para responder a las solicitudes de intent check, el extremo de intercambio de tokens debe realizar los siguientes pasos:
- Valida y decodifica la aserción de JWT.
- Verifica si la Cuenta de Google ya está presente en tu sistema de autenticación.
Valida y decodifica la aserción de JWT
Puedes validar y decodificar la aserción de JWT con un Biblioteca de decodificación JWT para tu lenguaje. Usa las claves públicas de Google, disponibles en JWK o PEM para verificar la firma del token.
Cuando se decodifica, la aserción de JWT luce como el 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, comprueba que el token de la aserción
entidad emisora (campo iss) es https://accounts.google.com, que el público
(campo aud) es tu ID de cliente asignado y que el token no haya vencido.
(Campo exp).
Usa los campos email, email_verified y hd para determinar si
Google aloja una dirección de correo electrónico y tiene la autoridad para hacerlo. En los casos en que Google sea
autorizado, se sabe que el usuario actualmente es el propietario legítimo de la cuenta
y puedes omitir la contraseña y otros métodos de verificación de identidad. De lo contrario, estos métodos
se puede usar para verificar la cuenta antes de realizar la vinculación.
Casos en los que Google es confiable:
emailtiene el sufijo@gmail.com; esta es una cuenta de Gmail.email_verifiedes verdadero yhdestá configurado. Esta es una cuenta de G Suite.
Los usuarios pueden registrarse en Cuentas de Google sin usar Gmail ni G Suite. Cuándo
email no contiene un sufijo @gmail.com ni hd, ni tampoco
se recomienda verificar con métodos de verificación, tanto confiables como con contraseñas
del usuario. email_verified también puede ser verdadero, ya que Google verificó inicialmente el
usuario cuando se creó la cuenta de Google, sin embargo, la propiedad del tercero
de correo electrónico puede haber cambiado desde entonces.
Verifica si la Cuenta de Google ya está presente en tu sistema de autenticación
Verifica si se cumple alguna de las siguientes condiciones:
- El ID de la Cuenta de Google, que se encuentra en el campo
subde la aserción, está en tu usuario en la base de datos. - La dirección de correo electrónico en la aserción coincide con un usuario de tu base de datos de usuarios.
Si se cumple alguna de estas condiciones, el usuario ya se registró. En ese caso, devolver una respuesta como la siguiente:
HTTP/1.1 200 Success
Content-Type: application/json;charset=UTF-8
{
"account_found":"true",
}
Si no se especifica el ID de la Cuenta de Google ni la dirección de correo electrónico
coincide con un usuario de tu base de datos, el usuario aún no se registró. En
en este caso, el extremo de intercambio de tokens debe responder con un error HTTP 404
que especifique "account_found": "false", como en el siguiente ejemplo:
HTTP/1.1 404 Not found
Content-Type: application/json;charset=UTF-8
{
"account_found":"false",
}
处理自动链接(获取 intent)
在用户同意访问其 Google 个人资料后,Google 会发送 请求,其中包含 Google 用户身份的已签名断言。通过 断言包含的信息包括用户的 Google 账号 ID、 姓名和电子邮件地址为您的 Google Cloud 控制台配置的令牌交换端点 项目处理该请求。
如果您的身份验证中已有相应的 Google 账号
系统,您的令牌交换端点将为用户返回一个令牌。如果
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&client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET
您的令牌交换端点必须能够处理以下参数:
| 令牌端点参数 | |
|---|---|
intent |
对于这些请求,此参数的值为 get。 |
grant_type |
所交换的令牌的类型。对于这类请求
参数的值为 urn:ietf:params:oauth:grant-type:jwt-bearer。 |
assertion |
一个 JSON Web 令牌 (JWT),提供 Google 用户身份。JWT 包含的信息包括用户 Google 账号 ID、姓名和电子邮件地址。 |
scope |
可选:您已将 Google 配置为向其请求访问权限的任何范围 用户。 |
client_id |
您分配给 Google 的客户 ID。 |
client_secret |
您分配给 Google 的客户端密钥。 |
如需响应 get intent 请求,您的令牌交换端点必须执行以下步骤:
- 验证和解码 JWT 断言。
- 检查您的身份验证系统中是否已存在该 Google 账号。
Valida y decodifica la aserción de JWT
Puedes validar y decodificar la aserción de JWT con un Biblioteca de decodificación JWT para tu lenguaje. Usa las claves públicas de Google, disponibles en JWK o PEM para verificar la firma del token.
Cuando se decodifica, la aserción de JWT luce como el 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, comprueba que el token de la aserción
entidad emisora (campo iss) es https://accounts.google.com, que el público
(campo aud) es tu ID de cliente asignado y que el token no haya vencido.
(Campo exp).
Usa los campos email, email_verified y hd para determinar si
Google aloja una dirección de correo electrónico y tiene la autoridad para hacerlo. En los casos en que Google sea
autorizado, se sabe que el usuario actualmente es el propietario legítimo de la cuenta
y puedes omitir la contraseña y otros métodos de verificación de identidad. De lo contrario, estos métodos
se puede usar para verificar la cuenta antes de realizar la vinculación.
Casos en los que Google es confiable:
emailtiene el sufijo@gmail.com; esta es una cuenta de Gmail.email_verifiedes verdadero yhdestá configurado. Esta es una cuenta de G Suite.
Los usuarios pueden registrarse en Cuentas de Google sin usar Gmail ni G Suite. Cuándo
email no contiene un sufijo @gmail.com ni hd, ni tampoco
se recomienda verificar con métodos de verificación, tanto confiables como con contraseñas
del usuario. email_verified también puede ser verdadero, ya que Google verificó inicialmente el
usuario cuando se creó la cuenta de Google, sin embargo, la propiedad del tercero
de correo electrónico puede haber cambiado desde entonces.
检查您的身份验证系统中是否已存在该 Google 账号
请检查以下任一条件是否成立:
- Google 账号 ID(可在断言的
sub字段中找到)位于您的用户中 数据库。 - 断言中的电子邮件地址与用户数据库中的用户匹配。
如果找到了用户的账号,请发出访问令牌,并在 HTTPS 响应正文的 JSON 对象中返回相应值,如以下示例所示:
{ "token_type": "Bearer", "access_token": "ACCESS_TOKEN", "refresh_token": "REFRESH_TOKEN", "expires_in": SECONDS_TO_EXPIRATION }
在某些情况下,基于 ID 令牌的账号关联可能会失败。如果
因为任何原因,您的令牌交换端点都需要以 HTTP 响应
指定 error=linking_error 的 401 错误,如以下示例所示:
HTTP/1.1 401 Unauthorized
Content-Type: application/json;charset=UTF-8
{
"error":"linking_error",
"login_hint":"foo@bar.com"
}
当 Google 收到包含 linking_error 的 401 错误响应时,会发送
使用 login_hint 作为参数将用户发送到您的授权端点。通过
用户在浏览器中使用 OAuth 关联流程完成账号关联。
使用“使用 Google 账号登录”处理账号创建(创建 intent)
当用户需要在您的服务中创建账号时,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&client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET
您的令牌交换端点必须能够处理以下参数:
| 令牌端点参数 | |
|---|---|
intent |
对于这些请求,此参数的值为 create。 |
grant_type |
要交换的令牌的类型。对于这些请求,此
参数的值为 urn:ietf:params:oauth:grant-type:jwt-bearer。 |
assertion |
JSON 网络令牌 (JWT),用于提供 Google 用户身份的签名断言。JWT 包含的信息包括用户的 Google 账号 ID、姓名和电子邮件地址。 |
client_id |
您分配给 Google 的客户端 ID。 |
client_secret |
您分配给 Google 的客户端密钥。 |
assertion 参数中的 JWT 包含用户的 Google 账号 ID、姓名和电子邮件地址,您可以使用这些信息在您的服务中创建新账号。
如需响应 create intent 请求,您的令牌交换端点必须执行以下步骤:
- 验证 JWT 断言并对其进行解码。
- 验证用户信息并创建新账号。
Valida y decodifica la aserción de JWT
Puedes validar y decodificar la aserción de JWT con un Biblioteca de decodificación JWT para tu lenguaje. Usa las claves públicas de Google, disponibles en JWK o PEM para verificar la firma del token.
Cuando se decodifica, la aserción de JWT luce como el 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, comprueba que el token de la aserción
entidad emisora (campo iss) es https://accounts.google.com, que el público
(campo aud) es tu ID de cliente asignado y que el token no haya vencido.
(Campo exp).
Usa los campos email, email_verified y hd para determinar si
Google aloja una dirección de correo electrónico y tiene la autoridad para hacerlo. En los casos en que Google sea
autorizado, se sabe que el usuario actualmente es el propietario legítimo de la cuenta
y puedes omitir la contraseña y otros métodos de verificación de identidad. De lo contrario, estos métodos
se puede usar para verificar la cuenta antes de realizar la vinculación.
Casos en los que Google es confiable:
emailtiene el sufijo@gmail.com; esta es una cuenta de Gmail.email_verifiedes verdadero yhdestá configurado. Esta es una cuenta de G Suite.
Los usuarios pueden registrarse en Cuentas de Google sin usar Gmail ni G Suite. Cuándo
email no contiene un sufijo @gmail.com ni hd, ni tampoco
se recomienda verificar con métodos de verificación, tanto confiables como con contraseñas
del usuario. email_verified también puede ser verdadero, ya que Google verificó inicialmente el
usuario cuando se creó la cuenta de Google, sin embargo, la propiedad del tercero
de correo electrónico 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 账号登录”添加到其他平台,以便用户可以在应用的所有界面上使用 Google 账号登录。或者,您也可以通过电子邮件向用户发送一个链接,该链接会启动密码恢复流程,让用户设置密码以便在其他平台上登录。
创建完成后,请发出访问令牌 ,并在 HTTPS 响应正文中的 JSON 对象内返回这些值,如以下示例所示:
{ "token_type": "Bearer", "access_token": "ACCESS_TOKEN", "refresh_token": "REFRESH_TOKEN", "expires_in": SECONDS_TO_EXPIRATION }
Obtén tu ID de cliente de la API de Google
Deberás proporcionar tu ID de cliente de la API de Google durante el proceso de registro de la vinculación de la cuenta.
Obtener tu ID de cliente de API con el proyecto que creaste mientras completabas los pasos de Vinculación de OAuth Para ello, completa los siguientes pasos:
- Ve a la página Clientes.
Crea o selecciona un proyecto de las APIs de Google.
Si tu proyecto no tiene un ID de cliente para el tipo de aplicación web, haz clic en Crear cliente para crear uno. Asegúrate de incluir el dominio de tu sitio en el cuadro Orígenes autorizados de JavaScript. Cuando realices pruebas o desarrollos locales, debes agregar
http://localhostyhttp://localhost:<port_number>al campo Orígenes de JavaScript autorizados.
Valida la implementación
Puedes validar tu implementación con la herramienta OAuth 2.0 Playground.
En la herramienta, sigue estos pasos:
- Haz clic en Configuración para abrir la ventana Configuración de OAuth 2.0.
- En el campo Flujo de OAuth, selecciona Del cliente.
- En el campo Extremos de OAuth, selecciona Personalizado.
- Especifica tu extremo de OAuth 2.0 y el ID de cliente que le asignaste a Google en los campos correspondientes.
- En la sección Paso 1, no selecciones ningún alcance de Google. En su lugar, deja este campo en blanco o escribe un alcance válido para tu servidor (o una cadena arbitraria si no usas alcances de OAuth). Cuando termines, haz clic en Autorizar APIs.
- En las secciones Paso 2 y Paso 3, sigue el flujo de OAuth 2.0 y verifica que cada paso funcione según lo previsto.
Puedes validar tu implementación con la herramienta de demostración de vinculación de Cuentas de Google.
En la herramienta, sigue estos pasos:
- Haz clic en el botón Acceder con Google.
- Elige la cuenta que quieras vincular.
- Ingresa el ID de servicio.
- De manera opcional, ingresa uno o más alcances para los que solicitarás acceso.
- Haz clic en Iniciar demostración.
- Cuando se te solicite, confirma que puedes dar tu consentimiento y rechazar la solicitud de vinculación.
- Confirma que se te redirecciona a tu plataforma.