Acceso a la cuenta vinculada

La vinculación de Cuentas de Google permite que los titulares de las Cuentas de Google se conecten de forma rápida, fluida y segura a tus servicios y compartan datos con Google.

El acceso con cuentas vinculadas habilita el acceso con One Tap con Google para los usuarios que ya tienen su Cuenta de Google vinculada a tu servicio. Esto mejora la experiencia de los usuarios, ya que pueden acceder con un clic sin tener que reingresar 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:

Cómo funciona

Requisito previo : El usuario ya vinculó su Cuenta de Google con su cuenta en tu servicio.

  1. Puedes habilitar la opción para mostrar las cuentas vinculadas durante el flujo de acceso con One Tap.
  2. El usuario verá un mensaje de acceso con One Tap con una opción para acceder a tu servicio con su cuenta vinculada.
  3. Si el usuario decide continuar con la cuenta vinculada, Google enviará una solicitud al extremo del token para guardar un código de autorización. La solicitud contiene el token de acceso del usuario que emitió tu servicio y un código de autorización de Google.
  4. Intercambia el código de autorización de Google por un token de ID de Google que contenga información sobre la Cuenta de Google del usuario.
  5. Tu app también recibe un token de ID cuando finaliza el flujo, y debes hacerlo coincidir con el identificador de usuario del token de ID que recibió tu servidor para hacer que el usuario acceda a tu app.
Acceso a la cuenta vinculada.
Figura 1: Flujo de acceso a la cuenta vinculada. Si el usuario accedió con varias cuentas en su dispositivo, es posible que vea un selector de cuentas y solo se lo dirigirá a la vista de Acceso con cuenta vinculada si elige una cuenta vinculada.

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 de la Guía de implementación para Android.

Controla 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 debe intercambiar por el token de ID del usuario. La solicitud contiene el token de acceso del usuario y un código de autorización OAuth2 emitido por Google.

Antes de guardar el código de autorización, debes verificar que el token de acceso que hayas otorgado a Google, identificado por 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

Tu extremo de intercambio de tokens debe ser capaz de administrar los siguientes parámetros de 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 Es el secreto del cliente obligatorio que emitió a Google.
access_token Obligatorio: Token de acceso que emitiste 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 el access_token se haya otorgado a Google y que haya identificado la client_id.
  • Usa 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 un código de error HTTP si la solicitud no es válida.

Respuesta HTTP

Se completó correctamente

Mostrar código de estado HTTP 200 OK

Muestra de respuesta correcta
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
Pragma: no-cache
{}

Errores

En el caso de una solicitud HTTP no 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"} Falta un parámetro en la solicitud, por lo que el servidor no puede continuar con la solicitud. También se puede mostrar si la solicitud incluye un parámetro no compatible o repite un parámetro.
401 {"error": "invalid_request"} Se produjo un error en 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 el desafío de autenticación “WWW-Authentication: Bearer” en el encabezado de respuesta.

El token de acceso del socio no es válido.
403 {"error": "insufficient_permission"}

Incluye el desafío de autenticación “WWW-Authentication: Bearer” en el encabezado de respuesta.

El token de acceso para socios no contiene los permisos necesarios para realizar la operación de OAuth recíproco.
500 {"error": "internal_error"} Error del servidor

La respuesta de error debe contener los siguientes campos :

Campos de respuesta de error
error String de error obligatoria
error_description Descripción del error legible por humanos
error_uri El URI que proporciona más detalles sobre el error
Respuesta de muestra de error 400
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."
}

Intercambia el código de autorización por el token de ID

Deberás intercambiar el código de autorización que recibiste por un token de ID de Google que contenga 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 solicitudes
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 Como 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 envía tu aplicación 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 de 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, expresada 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 Para el caso de uso del Acceso con cuenta vinculada, el valor de este campo siempre se establece como OpenID
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

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:

  • 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 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.