El tipo de vinculación optimizada para el Acceso con Google basado en OAuth agrega el Acceso con Google además de la vinculación de cuentas basada en OAuth. Esto proporciona una vinculación fluida basada en voz para los usuarios de Google, a la vez que se habilita la vinculación de cuentas para los usuarios que se registraron en tu servicio con una identidad que no es de Google.
Este tipo de vinculación comienza con el Acceso con Google, que te permite verificar si la información de perfil de Google del usuario existe en tu sistema. Si no encuentras la información del usuario en tu sistema, comienza un flujo estándar de OAuth. El usuario también puede crear una cuenta nueva con la información de su perfil de Google.

Para vincular cuentas con el tipo de vinculación optimizada, sigue estos pasos generales:
- Primero, pídele al usuario que dé su consentimiento para acceder a su perfil de Google.
- Utilizar la información de su perfil para identificar al usuario
- Si no encuentras una coincidencia para el usuario de Google en tu sistema de autenticación, el flujo continúa dependiendo de si configuraste tu proyecto de acciones en la Consola de Actions para permitir la creación de la cuenta de usuario mediante voz o solo en tu sitio web.
- Si permites la creación de cuentas mediante voz, valida el token de ID recibido de Google. Luego, puedes crear un usuario a partir de la información de perfil que contiene el token de ID.
- Si no permites la creación de cuentas mediante voz, se transfiere al usuario a un navegador en el que puede cargar tu página de autorización y completar el flujo de creación de usuarios.

Creación de cuentas de asistencia por voz
Si permites que se creen cuentas de usuario mediante la voz, Asistente le preguntará si desea hacer lo siguiente:
- Crear una cuenta nueva en su sistema con la información de su Cuenta de Google
- Accede a tu sistema de autenticación con una cuenta diferente si ya tiene una cuenta que no es de Google.
Se recomienda permitir la creación de cuentas mediante la voz si deseas minimizar la fricción del flujo de creación de cuentas. El usuario solo debe salir del flujo de voz si desea acceder con una Cuenta que no sea de Google.
No permitir la creación de cuentas por voz
Si no permites la creación de cuentas de usuario mediante la voz, Asistente abrirá la URL del sitio web que proporcionaste para la autenticación de usuarios. Si la interacción se produce en un dispositivo que no tiene pantalla, Asistente dirigirá al usuario a un teléfono para continuar con el flujo de vinculación de cuentas.
Se recomienda no permitir la creación en los siguientes casos:
No deseas permitir que los usuarios que tienen cuentas ajenas a Google creen una nueva cuenta de usuario y deseas que se vinculen a las cuentas de usuario existentes en tu sistema de autenticación. Por ejemplo, si ofreces un programa de lealtad, es posible que quieras asegurarte de que el usuario no pierda los puntos acumulados en su cuenta existente.
Debe tener control total sobre el flujo de creación de cuentas. Por ejemplo, puedes inhabilitar la creación si necesitas mostrarle las condiciones del servicio al usuario durante la creación de la cuenta.
Implementa la vinculación "Optimizada" de Acceso con Google basada en OAuth
Las cuentas se vinculan con flujos estándar de la industria de OAuth 2.0. Actions on Google admite los flujos de código implícitos y de autorización.
En el flujo de código implícito, Google abre tu extremo de autorización en el navegador del usuario. Después de acceder correctamente, devuelves un token de acceso de larga duración a Google. Este token de acceso ahora se incluye en cada solicitud que envía el Asistente a tu acción.
En el flujo de código de autorización, necesitas dos extremos:
- El extremo authorization, que se encarga de presentar la IU de acceso a los usuarios que aún no accedieron y de registrar el consentimiento para el acceso solicitado en forma de un código de autorización de corta duración.
- El extremo de intercambio de tokens, que es responsable de dos tipos de intercambios:
- Intercambia un código de autorización por un token de actualización de larga duración y un token de acceso de corta duración. Este intercambio se produce cuando el usuario pasa por el flujo de vinculación de cuentas.
- Intercambia un token de actualización de larga duración por un token de acceso de corta duración. Este intercambio ocurre cuando Google necesita un token de acceso nuevo porque el que había vencido.
Si bien el flujo de código implícito es más fácil de implementar, Google recomienda que los tokens de acceso emitidos con el flujo implícito nunca venzan, porque el vencimiento del token con el flujo implícito obliga al usuario a vincular su cuenta nuevamente. Si necesitas el vencimiento del token por razones de seguridad, debes considerar usar el flujo de código de Auth.
Configura el proyecto
Si deseas configurar tu proyecto para que use la vinculación optimizada, sigue estos pasos:
- Abre la Consola de Actions y selecciona el proyecto que quieres usar.
- Haz clic en la pestaña Desarrollo y selecciona Vinculación de cuentas.
- Habilita el interruptor junto a Vinculación de cuentas.
- En la sección Creación de cuenta, selecciona Sí.
En Tipo de vinculación, selecciona OAuth y Acceso con Google y, también, Implícito.
En Información del cliente, haz lo siguiente:
- Asigna un valor al ID de cliente emitido por tus acciones para Google a fin de identificar las solicitudes que provienen de Google.
- Inserte las URL de sus extremos de autorización y de intercambio de tokens.
Haz clic en Guardar.
Implementa tu servidor de OAuth
Para admitir el flujo implícito de OAuth 2.0, tu servicio pone a disposición un extremo de autorización mediante HTTPS. Este extremo es responsable de la autenticación y la obtención del consentimiento de los usuarios para el acceso a los datos. El extremo de autorización presenta una IU de acceso a los usuarios que aún no accedieron y registra el consentimiento para el acceso solicitado.
Cuando tu acción necesita llamar a una de las APIs autorizadas de tu servicio, Google usa este extremo a fin de obtener permiso de los usuarios para llamar a estas APIs en su nombre.
Una sesión de flujo implícita típica de OAuth 2.0 que inicia Google tiene el siguiente flujo:
- Google abre tu extremo de autorización en el navegador del usuario. El usuario accede si aún no lo ha hecho y le otorga permiso a Google para acceder a sus datos con tu API si aún no lo ha otorgado.
- Tu servicio crea un token de acceso y lo muestra a Google mediante el redireccionamiento del navegador del usuario a Google con el token de acceso adjunto a la solicitud.
- Google llama a las API de tu servicio y adjunta el token de acceso con cada solicitud. Tu servicio verifica que el token de acceso otorgue autorización a Google para acceder a la API y, luego, completa la llamada a la API.
Controla las solicitudes de autorización
Cuando tu acción necesita realizar una vinculación de cuentas a través de un flujo implícito de OAuth 2.0, Google envía al usuario a tu extremo de autorización con una solicitud que incluye los siguientes parámetros:
Parámetros de extremo de autorización | |
---|---|
client_id |
Es el ID de cliente que asignaste a Google. |
redirect_uri |
La URL a la que envías la respuesta a esta solicitud. |
state |
Un valor de contabilidad que se devuelve a Google sin cambios en el URI de redireccionamiento. |
response_type |
El tipo de valor que se muestra en la respuesta. Para el flujo implícito de OAuth 2.0, el tipo de respuesta siempre es token . |
Por ejemplo, si tu extremo de autorización está disponible en https://myservice.example.com/auth
,
la solicitud podría verse de la siguiente manera:
GET https://myservice.example.com/auth?client_id=GOOGLE_CLIENT_ID&redirect_uri=REDIRECT_URI&state=STATE_STRING&response_type=token
Para que el extremo de autorización controle las solicitudes de acceso, sigue estos pasos:
Verifica los valores
client_id
yredirect_uri
para evitar otorgar acceso a apps cliente no deseadas o mal configuradas:- Confirma que
client_id
coincida con el ID de cliente que le asignaste a Google. - Confirma que la URL especificada por el parámetro
redirect_uri
tenga el siguiente formato:https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID
YOUR_PROJECT_ID es el ID que se encuentra en la página Configuración del proyecto de la Consola de Actions.
- Confirma que
Verifica si el usuario accedió a tu servicio. Si el usuario no accedió, completa el flujo de acceso o registro del servicio.
Genera un token de acceso que Google usará para acceder a tu API. El token de acceso puede ser cualquier valor de string, pero debe representar de manera única al usuario y al cliente al que corresponde el token y no debe poder adivinarse.
Envía una respuesta HTTP que redireccione el navegador del usuario a la URL que especifica el parámetro
redirect_uri
. Incluye todos los siguientes parámetros en el fragmento de URL:access_token
: Es el token de acceso que acabas de generar.token_type
: Es la stringbearer
.state
: Es el valor de estado no modificado de la solicitud original. El siguiente es un ejemplo de la URL resultante:https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID#access_token=ACCESS_TOKEN&token_type=bearer&state=STATE_STRING
.
El controlador de redireccionamiento de OAuth 2.0 de Google recibirá el token de acceso y confirmará que el valor state
no haya cambiado. Una vez que Google haya obtenido un token de acceso para el servicio, adjuntará el token a las llamadas subsiguientes a la acción como parte de AppRequest.
Cómo controlar vinculaciones automáticas
Una vez que el usuario da su consentimiento para la acción a fin de acceder a su perfil de Google, Google envía una solicitud que contiene una aserción firmada de la identidad del usuario de Google. La aserción contiene información que incluye el ID de la Cuenta de Google, el nombre y la dirección de correo electrónico del usuario. El extremo de intercambio de tokens configurado para tu proyecto controla esa solicitud.
Si la Cuenta de Google correspondiente ya está presente en tu sistema de autenticación, el extremo de intercambio de tokens muestra un token para el usuario. Si la Cuenta de Google no coincide con un usuario existente, el extremo de intercambio de tokens muestra un error user_not_found
.
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=get&assertion=JWT&consent_code=CONSENT_CODE&scope=SCOPES
Tu extremo de intercambio de tokens debe ser capaz de admitir los siguientes parámetros:
Parámetros de extremo del token | |
---|---|
grant_type |
Es el tipo de token que se intercambiará. Para estas solicitudes, este parámetro tiene el valor urn:ietf:params:oauth:grant-type:jwt-bearer . |
intent |
Para estas solicitudes, el valor de este parámetro es "get". |
assertion |
Un token web JSON (JWT) que proporciona una aserción firmada de la identidad del usuario de Google. El JWT contiene información que incluye el ID, el nombre y la dirección de correo electrónico de la Cuenta de Google del usuario. |
consent_code |
Opcional: Cuando está presente, se muestra un código único que indica que el usuario otorgó su consentimiento para que tu acción acceda a los alcances especificados. |
scope |
Opcional: Cualquier permiso que hayas configurado en Google para solicitar a los usuarios. |
Cuando tu extremo de intercambio de tokens recibe la solicitud de vinculación, debería hacer lo siguiente:
Valida y decodifica la aserción de JWT
Puedes validar y decodificar la aserción de JWT con una biblioteca de decodificación de JWT para tu lenguaje. Usa las claves públicas de Google (disponibles en formato JWK o PEM) para verificar la firma del token.
Cuando se decodifica, la aserción de 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 "locale": "en_US" }
Además de verificar la firma del token, verifica que la entidad emisora de la aserción (campo iss
) sea https://accounts.google.com
y que el público (campo aud
) sea el ID de cliente asignado a tu acción.
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
sub
de la aserción, se encuentra en tu base de datos de usuarios. - La dirección de correo electrónico de la aserción coincide con un usuario de tu base de datos de usuarios.
Si se cumple alguna de las dos condiciones, el usuario ya se registró y puedes emitir un token de acceso.
Si ni el ID de la Cuenta de Google ni la dirección de correo electrónico especificada en la aserción coinciden con un usuario de tu base de datos, significa que el usuario aún no se registró. En este caso, tu extremo de intercambio de tokens debe responder con un error HTTP 401, que especifica error=user_not_found
, como en el siguiente ejemplo:
HTTP/1.1 401 Unauthorized Content-Type: application/json;charset=UTF-8 { "error":"user_not_found", }Cuando Google recibe la respuesta de error 401 con un error
user_not_found
, llama a tu extremo de intercambio de tokens con el valor del parámetro intent
configurado como create y envía un token de ID que contiene la información de perfil del usuario con la solicitud.
Controla la creación de cuentas con Acceso con Google
Cuando un usuario necesita crear una cuenta en tu servicio, Google realiza una solicitud a tu extremo de intercambio de tokens que especifica intent=create
, como en el siguiente ejemplo:
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&consent_code=CONSENT_CODE&assertion=JWT[&NEW_ACCOUNT_INFO]
El parámetro assertion
contiene un token web JSON (JWT) que proporciona una aserción firmada de la identidad del usuario de Google. El JWT contiene información que incluye el ID, el nombre y la dirección de correo electrónico de la Cuenta de Google del usuario, que puedes usar para crear una cuenta nueva en tu servicio.
Para responder a las solicitudes de creación de cuentas, tu extremo de intercambio de tokens debe hacer lo siguiente:
Valida y decodifica la aserción de JWT
Puedes validar y decodificar la aserción de JWT con una biblioteca de decodificación de JWT para tu lenguaje. Usa las claves públicas de Google (disponibles en formato JWK o PEM) para verificar la firma del token.
Cuando se decodifica, la aserción de 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 "locale": "en_US" }
Además de verificar la firma del token, verifica que la entidad emisora de la aserción (campo iss
) sea https://accounts.google.com
y que el público (campo aud
) sea el ID de cliente asignado a tu acción.
Validar la información del usuario y crear una cuenta nueva
Verifica si se cumple alguna de las siguientes condiciones:
- El ID de la Cuenta de Google, que se encuentra en el campo
sub
de la aserción, se encuentra en tu base de datos de usuarios. - La dirección de correo electrónico de la aserción coincide con un usuario de tu base de datos de usuarios.
Si se cumple alguna de las dos condiciones, pídele al usuario que vincule la cuenta existente con la Cuenta de Google. Para ello, responde la solicitud con un error HTTP 401 y especifica error=linking_error
y la dirección de correo electrónico del usuario como login_hint
, como se muestra en el siguiente ejemplo:
HTTP/1.1 401 Unauthorized Content-Type: application/json;charset=UTF-8 { "error":"linking_error", "login_hint":"foo@bar.com" }
Si ninguna de las condiciones es verdadera, crea una cuenta de usuario nueva con la información proporcionada en el JWT. Por lo general, las cuentas nuevas no tienen una contraseña establecida. Se recomienda que agregues el Acceso con Google a otras plataformas para permitir que los usuarios accedan a través de Google en todas las plataformas de tu aplicación. Como alternativa, puedes enviar al usuario un vínculo para iniciar el flujo de recuperación de contraseña a fin de que este pueda configurar una contraseña a fin de acceder en otras plataformas.
Cuando se complete la creación, emite un token de acceso y muestra los valores de un objeto JSON en el cuerpo de tu respuesta HTTPS, como en el siguiente ejemplo:
{ "token_type": "Bearer", "access_token": "ACCESS_TOKEN", "expires_in": SECONDS_TO_EXPIRATION }
Diseña la interfaz de usuario de voz para el flujo de autenticación
Verifica si el usuario está verificado y comienza el flujo de vinculación de cuentas
- Abra su proyecto de Actions Builder en Actions Console.
- Crea una escena nueva para iniciar la vinculación de cuentas en tu acción:
- Haz clic en Escenas.
- Haz clic en el ícono de agregar (+) para agregar una escena nueva.
- En la escena recién creada, haz clic en el ícono para agregar add en Condiciones.
- Agrega una condición que verifique si el usuario asociado con la conversación es un usuario verificado. Si falla la verificación, tu acción no podrá realizar la vinculación de cuentas durante la conversación y debería dar acceso a funcionalidades que no requieran la vinculación de cuentas.
- En el campo
Enter new expression
, en Condition, ingresa la siguiente lógica:user.verificationStatus != "VERIFIED"
- En Transition, selecciona una escena que no requiera la vinculación de cuentas o una escena que sea el punto de entrada a la funcionalidad solo para invitados.
- En el campo
- Haz clic en el ícono para agregar add en Condiciones.
- Agrega una condición para activar un flujo de vinculación de cuentas si el usuario no tiene una identidad asociada.
- En el campo
Enter new expression
, en Condition, ingresa la siguiente lógica:user.verificationStatus == "VERIFIED"
- En Transition, selecciona la escena del sistema Account Linking.
- Haz clic en Guardar.
- En el campo
Después de guardar, se agregará a tu proyecto una nueva escena del sistema de vinculación de cuentas llamada <SceneName>_AccountLinking
.
Cómo personalizar la escena de vinculación de cuentas
- En Escenas, selecciona la escena del sistema de vinculación de cuentas.
- Haz clic en Enviar mensaje y agrega una oración corta para describir al usuario por qué la acción debe acceder a su identidad (por ejemplo, "Para guardar tus preferencias").
- Haz clic en Guardar.
- En Condiciones, haga clic en Si el usuario completa la vinculación de la cuenta correctamente.
- Configura cómo debe proceder el flujo si el usuario acepta vincular su cuenta. Por ejemplo, llama al webhook para procesar cualquier lógica empresarial personalizada necesaria y volver a la escena de origen.
- Haz clic en Guardar.
- En Condiciones, haga clic en Si el usuario cancela o descarta la vinculación de cuentas.
- Configura cómo debe proceder el flujo si el usuario no acepta vincular su cuenta. Por ejemplo, envía un mensaje de confirmación y redirecciona a escenas que proporcionen una funcionalidad que no requiera la vinculación de cuentas.
- Haz clic en Guardar.
- En Condiciones, haga clic en Si se produce un error del sistema o de la red.
- Configura cómo debe proceder el flujo si no se puede completar el flujo de vinculación de cuentas debido a errores del sistema o de la red. Por ejemplo, envía un mensaje de confirmación y redirecciona a escenas que proporcionen una funcionalidad que no requiera la vinculación de cuentas.
- Haz clic en Guardar.
Cómo controlar solicitudes de acceso a datos
Si la solicitud de Asistente contiene un token de acceso, primero verifica que el token de acceso sea válido y no haya vencido. Luego, recupera de la base de datos de tu cuenta de usuario la cuenta de usuario asociada con el token.