La vinculación de Cuentas de Google permite que los titulares de Cuentas de Google se conecten a tus servicios y compartan datos con Google de forma rápida, fluida y segura.
El Acceso con cuenta vinculada habilita Acceder con One Tap con Google para los usuarios que ya tienen sus Cuentas de Google vinculadas a tu servicio. Esto mejora la experiencia de los usuarios, ya que pueden acceder con un clic sin tener que volver a ingresar su nombre de usuario y contraseña. También reduce las posibilidades de que los usuarios creen cuentas duplicadas en tu servicio.
Requisitos
Para implementar el Acceso con cuenta vinculada, debes cumplir con los siguientes requisitos:
- Tienes una implementación de la vinculación de OAuth de la Cuenta de Google que admite el flujo de código de autorización de OAuth 2.0. Tu implementación de OAuth debe incluir los siguientes extremos:
- extremo de autorización para controlar las solicitudes de autorización.
- extremo del token para controlar la solicitud de acceso y los tokens de actualización.
- extremo userinfo para recuperar la información básica de la cuenta sobre el usuario vinculado que se le muestra al usuario durante el proceso de acceso a la cuenta vinculada.
- Tienes una app para Android.
Cómo funciona
Requisito previo : El usuario ya vinculó su Cuenta de Google con su cuenta en tu servicio.
- Puedes aceptar mostrar las cuentas vinculadas durante el flujo de acceso con One Tap.
- El usuario ve un mensaje de acceso con One Tap con una opción para acceder a tu servicio con su cuenta vinculada.
- Si el usuario elige continuar con la cuenta vinculada, Google envía una solicitud al extremo del token para guardar un código de autorización. La solicitud contiene el token de acceso del usuario emitido por tu servicio y un código de autorización de Google.
- El código de autorización de Google se intercambia por un token de ID de Google que contiene información acerca de la Cuenta de Google del usuario.
- Tu app también recibe un token de ID cuando finaliza el flujo y lo comparas con el identificador de usuario en el token de ID que recibió tu servidor para hacer que el usuario acceda a tu app.
Implementa el Acceso con cuenta vinculada en tu app para Android
Para admitir el acceso con cuenta vinculada en tu app para Android, sigue las instrucciones en la Guía de implementación para Android.
Gestionar las solicitudes de código de autorización de Google
Google realiza una solicitud POST al extremo del token para guardar un código de autorización que se intercambia por el token de ID del usuario. La solicitud contiene el token de acceso del usuario y un código de autorización de OAuth2 emitido por Google.
Antes de guardar el código de autorización, debes verificar que el token de acceso que le otorgaste a Google, identificado por el client_id
.
Solicitud HTTP
Solicitud de muestra
POST /token HTTP/1.1
Host: server.example.com
Content-Type: application/x-www-form-urlencoded
code=GOOGLE_AUTHORIZATION_CODE
&grant_type=urn:ietf:params:oauth:grant-type:reciprocal
&client_id=CLIENT_ID
&client_secret=CLIENT_SECRET
&access_token=ACCESS_TOKEN
El extremo de intercambio de tokens debe ser capaz de controlar los siguientes parámetros de la solicitud:
Parámetros de extremo del token | |
---|---|
code |
Código de autorización de Google OAuth2 obligatorio |
client_id |
ID de cliente obligatorio que emitió a Google |
client_secret |
El secreto del cliente obligatorio que emitió a Google |
access_token |
Obligatorio: Es el token de acceso que le enviaste a Google. Usarás esto para obtener el contexto del usuario |
grant_type |
El valor obligatorio se DEBE establecer en urn:ietf:params:oauth:grant-type:reciprocal . |
Tu extremo de intercambio de tokens debe responder a la solicitud POST de la siguiente manera:
- Verifica que se haya otorgado el
access_token
a Google, que se identificó por elclient_id
. - Responde con una respuesta HTTP 200 (OK) si la solicitud es válida y el código de autorización se intercambia correctamente por un token de ID de Google, o bien con un código de error HTTP si la solicitud no es válida.
Respuesta HTTP
Listo
Mostrar código de estado HTTP 200 OK
Muestra de respuesta exitosa
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
Pragma: no-cache
{}
Errores
Si una solicitud HTTP no es válida, responde con uno de los siguientes códigos de error HTTP:
Código de estado HTTP | Cuerpo | Descripción |
---|---|---|
400 | {"error": "invalid_request"} |
La solicitud no tiene un parámetro, por lo que el servidor no puede continuar con ella. También se puede mostrar si la solicitud incluye un parámetro no compatible o repite un parámetro. |
401 | {"error": "invalid_request"} |
Falló la autenticación del cliente, por ejemplo, si la solicitud contiene un ID o secreto de cliente no válido |
401 | {"error": "invalid_token"}
Incluye "WWW-Authentication: Portador" Auth en el encabezado de la respuesta |
El token de acceso del socio no es válido. |
403 | {"error": "insufficient_permission"}
Incluye "WWW-Authentication: Portador" Auth en el encabezado de la respuesta |
El token de acceso del socio no contiene los permisos necesarios para realizar el OAuth recíproco. |
500 | {"error": "internal_error"} |
Error de servidor |
La respuesta de error debe contener los siguientes campos :
Campos de respuesta de errores | |
---|---|
error |
Obligatoria String de error |
error_description |
Descripción legible del error |
error_uri |
Es el URI que proporciona más detalles sobre el error. |
Respuesta de error 400 de muestra
HTTP/1.1 400 Bad Request
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache
{
"error": "invalid_request",
"error_description": "Request was missing the 'access_token' parameter."
}
Cambiar código de autorización para el token de ID
Deberás intercambiar el código de autorización que recibiste por un token de ID de Google que contiene información sobre la Cuenta de Google del usuario.
Para intercambiar un código de autorización por un token de ID de Google, llama al extremo https://oauth2.googleapis.com/token
y establece los siguientes parámetros:
Campos de la solicitud | |
---|---|
client_id |
Obligatorio El ID de cliente obtenido de la página de credenciales de la Consola de APIs. Por lo general, será la credencial con el nombre New Actions on Google App. |
client_secret |
Obligatorio: El secreto del cliente obtenido de la página de credenciales de la Consola de APIs |
code |
Obligatorio: El código de autorización enviado en la solicitud inicial |
grant_type |
Obligatorio Según se define en la especificación de OAuth 2.0, el valor de este campo se debe establecer en authorization_code . |
Solicitud de muestra
POST /oauth2/v4/token HTTP/1.1
Host: www.googleapis.com
Content-Type: application/x-www-form-urlencoded
code=GOOGLE_AUTHORIZATION_CODE
&grant_type=authorization_code
&client_id=GOOGLE_CLIENT_ID
&client_secret=GOOGLE_CLIENT_SECRET
Para responder a esta solicitud, Google muestra un objeto JSON que contiene un token de acceso de corta duración y un token de actualización.
La respuesta contiene los siguientes campos:
Campos de respuesta | |
---|---|
access_token |
Token de acceso emitido por Google que tu aplicación envía para autorizar una solicitud a la API de Google |
id_token |
El token de ID contiene la información de la Cuenta de Google del usuario. La sección Validar respuesta contiene detalles sobre cómo decodificar y validar la respuesta del token de ID |
expires_in |
La vida útil restante del token de acceso, en segundos |
refresh_token |
Un token que puedes usar para obtener un token de acceso nuevo. Los tokens de actualización son válidos hasta que el usuario revoque el acceso |
scope |
El valor de este campo siempre se establece como openid para el caso de uso de Acceso con cuenta vinculada. |
token_type |
El tipo de token que se muestra. En este momento, el valor de este campo siempre está establecido en Bearer . |
Respuesta de muestra
HTTP/1.1 200 OK
Content-type: application/json; charset=utf-8
{
"access_token": "Google-access-token",
"id_token": "Google-ID-token",
"expires_in": 3599,
"token_type": "Bearer",
"scope": "openid",
"refresh_token": "Google-refresh-token"
}
POST /oauth2/v4/token HTTP/1.1
Host: www.googleapis.com
Content-Type: application/x-www-form-urlencoded
code=Google authorization code
&grant_type=authorization_code
&client_id=Google client id
&client_secret=Google client secret
Valida la respuesta del token de ID
验证和解码 JWT 断言
您可以使用 适用于您所用语言的 JWT 解码库。使用 Google 的公钥,在 JWK 或 PEM 格式,用于验证 令牌的签名。
解码后,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
字段)。
使用 email
、email_verified
和 hd
字段,您可以确定
Google 负责托管电子邮件地址,并对其具有权威性。如果 Google
权威性 - 用户当前被认定为合法账号所有者
您可以跳过密码或其他验证方法。否则,这些方法
可用于在关联之前验证账号。
Google 具有权威性的情形:
email
的后缀为@gmail.com
,这是一个 Gmail 账号。email_verified
为 true 且hd
已设置,这是 G Suite 账号。
用户无需使用 Gmail 或 G Suite 即可注册 Google 账号。时间
email
不包含 @gmail.com
后缀,且 hd
不存在 Google 不
建议使用权威凭据和密码或其他验证方法进行验证
用户。email_verified
可能为 true,因为 Google 最初验证了
创建 Google 账号后,该用户会获得第三方的所有权,
后,电子邮件账号可能已更改。