Acceso a la cuenta vinculada

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

El Acceso con Cuenta vinculada 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 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 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.
    • token endpoint para controlar la solicitud de tokens de acceso y actualización.
    • Extremo userinfo para recuperar información básica de la cuenta sobre el usuario vinculado que se le muestra al usuario durante el proceso de acceso con cuenta vinculada.
  • Tienes una app para Android.

Cómo funciona

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

  1. Aceptas mostrar las cuentas vinculadas durante el flujo de Acceso con un toque.
  2. Se le muestra al usuario un mensaje de Acceso con un toque con la opción de acceder a tu servicio con su cuenta vinculada.
  3. Si el usuario elige continuar con la cuenta vinculada, Google envía una solicitud a tu extremo de 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. Intercambias el código de autorización de Google por un token de ID de Google que contiene información sobre la Cuenta de Google del usuario.
  5. 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 que el usuario acceda a tu app.
Acceso a la cuenta vinculada
Figura 1. Flujo de acceso de la cuenta vinculada. Si el usuario tiene varias cuentas en las que accedió en su dispositivo, es posible que vea un selector de cuentas y solo se lo dirija a la vista de acceso de la cuenta vinculada si selecciona una.

Implementa el acceso con Cuenta vinculada en tu app para Android

Para admitir el acceso con Cuentas vinculadas en tu app para Android, sigue las instrucciones de la Guía de implementación para Android.

Controla las solicitudes de códigos de autorización de Google

Google realiza una solicitud POST a tu extremo de token para guardar un código de autorización que intercambias 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 le otorgaste el token de acceso 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 poder controlar los siguientes parámetros de solicitud:

Parámetros del extremo del token
code Código de autorización de OAuth2 de Google obligatorio
client_id ID de cliente obligatorio que le enviaste a Google
client_secret Obligatorio: Secreto de cliente que emitiste a Google
access_token Obligatorio: Es el token de acceso que emitiste a Google. La usarás para obtener el contexto del usuario.
grant_type Obligatorio: El valor DEBE establecerse 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 identificado por el client_id.
  • Responde con una respuesta HTTP 200 (OK) si la solicitud es válida y el código de autorización se cambia 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

Devuelve el código de estado HTTP 200 OK

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

Errores

En caso de que se produzca 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 ella. También se puede mostrar si la solicitud incluye un parámetro no admitido o repite un parámetro.
401 {"error": "invalid_request"} La autenticación del cliente falló, 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 del socio no contiene los permisos necesarios para realizar el 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 Cadena de error obligatoria
error_description Descripción legible por humanos del error
error_uri URI que proporciona más detalles sobre el error
Ejemplo de respuesta 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 un 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 la solicitud
client_id Obligatorio: Es el ID de cliente que se obtiene de la página Credenciales de la Consola de APIs. Por lo general, esta será la credencial con el nombre New Actions on Google App.
client_secret Obligatorio: Es el secreto de cliente que se obtiene en la página Credenciales de la Consola de API.
code Obligatorio: Es el código de autorización que se envió en la solicitud inicial.
grant_type Obligatorio Como se define en la especificación de OAuth 2.0, el valor de este campo debe establecerse 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

Google responde a esta solicitud mostrando 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 Es un 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 Validar respuesta contiene detalles para decodificar y validar la respuesta del token de ID.
expires_in Es la vida útil restante del token de acceso en segundos.
refresh_token Es un token que puedes usar para obtener un nuevo token de acceso. Los tokens de actualización son válidos hasta que el usuario revoca el acceso.
scope El valor de este campo siempre se establece en openid para el caso de uso de acceso con cuenta vinculada.
token_type Es el tipo de token que se muestra. En este momento, el valor de este campo siempre se establece 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