El tipo de vinculación por OAuth admite dos flujos de OAuth 2.0 estándares de la industria: los flujos de código implícito y de autorización.
在隐式代码流程中,Google 会在用户浏览器中打开您的授权端点。成功登录后,系统会向 Google 返回长期访问令牌。现在,从 Google 助理向你的 Action 发送的每个请求中都包含此访问令牌。
在授权代码流程中,您需要两个端点:
- 授权端点,该端点负责向尚未登录的用户显示登录界面,并以短期授权代码的形式记录所请求的访问。
- 令牌交换端点,负责两种类型的交换:
- 将授权代码交换为长期刷新令牌和短期访问令牌。用户完成帐号关联流程后,系统会进行这种交换。
- 将长期刷新令牌换成短期访问令牌。Google 需要新访问令牌时,由于此令牌已过期,因此会进行此交换。
虽然隐式代码流程的实现更简单,但 Google 建议通过隐式流程发出的访问令牌永远不会过期,因为将令牌过期与隐式流程一起使用会强制用户再次关联其帐号。如果出于安全考虑需要令牌到期,强烈建议您考虑使用身份验证代码流程。
Implementa la vinculación de cuentas con OAuth
Configura el proyecto
Para configurar tu proyecto de modo que use la vinculación por OAuth, sigue estos pasos:
- Abre la Consola de Actions y selecciona el proyecto que deseas usar.
- Haz clic en la pestaña Desarrollar y elige Vinculación de la cuenta.
- Activa el interruptor junto a Vinculación de cuentas.
- En la sección Creación de cuentas, selecciona No, solo quiero permitir la creación de cuentas en mi sitio web.
En Tipo de vinculación, selecciona OAuth y Código de autorización.
En Client Information, haz lo siguiente:
- Asigna un valor a Client ID issued by your Actions to Google para identificar las solicitudes provenientes de Google.
- Toma nota del valor del ID de cliente que Google emitió para tus Acciones.
- Inserta las URLs de tus extremos de autorización y de intercambio de tokens.
- Haz clic en Guardar.
Implementa tu servidor de OAuth
Una implementación del servidor OAuth 2.0 del flujo de código de autorización consta de dos extremos, que tu servicio pone a disposición a través de HTTPS. El primer extremo es el extremo de autorización, que es responsable de encontrar u obtener el consentimiento de los usuarios para acceder a los datos. El extremo de autorización presenta una solicitud para los usuarios que aún no hayan accedido y que registran su consentimiento solicitaron acceso. El segundo extremo es el extremo de intercambio de tokens, que es se usan para obtener cadenas encriptadas llamadas tokens que autorizan al usuario para acceder a tu servicio.
Cuando tu acción necesita llamar a una de las APIs de tu servicio, Google usa estas de extremo a fin de obtener permiso de los usuarios para llamar a estas APIs en sus nombre.
La sesión del flujo de código de autorización de OAuth 2.0 que inicia Google tiene el siguiente flujo:
- Google abre el extremo de autorización en el navegador del usuario. Si el flujo que se iniciara en un dispositivo solo de voz para una Acción, Google transferiría el ejecución a un teléfono.
El usuario accede a su cuenta (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 han otorgado permiso.
Tu servicio crea un código de autorización y lo devuelve a Google mediante redireccionar el navegador del usuario de vuelta a Google con el código de autorización que se adjuntan a la solicitud.
Google envía el código de autorización a tu extremo de intercambio de token, que verifica la autenticidad del código y devuelve un token de acceso y un token de actualización. El token de acceso es un token de corta duración que acepta como credenciales para acceder a las APIs. El token de actualización es de larga duración token que Google puede almacenar y usar para adquirir nuevos tokens de acceso cuando y vencer.
Después de que el usuario completa el flujo de vinculación de cuentas, cada de entrega enviada desde el Asistente a tu webhook de entrega token de acceso.
Maneja solicitudes de autorización
Cuando tu acción necesite vincular cuentas mediante un código de autorización de OAuth 2.0 flujo, Google envía al usuario a tu extremo de autorización con una solicitud que incluye los siguientes parámetros:
| Parámetros del extremo de autorización | |
|---|---|
client_id |
El ID de cliente de Google que registraste en 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 modificar en el URI de redireccionamiento. |
scope |
Opcional: Un conjunto de strings de alcance delimitado por espacios que especifica la datos para los que Google solicita autorización. |
response_type |
La string code. |
Por ejemplo, si tu extremo de autorización está disponible en https://myservice.example.com/auth,
una solicitud podría verse así:
GET https://myservice.example.com/auth?client_id=GOOGLE_CLIENT_ID&redirect_uri=REDIRECT_URI&state=STATE_STRING&scope=REQUESTED_SCOPES&response_type=code
Para que tu extremo de autorización controle las solicitudes de acceso, sigue estos pasos:
Verifica que
client_idcoincida con el ID de cliente de Google con el que te registraste Google y queredirect_uricoincida con la URL de redireccionamiento que proporciona Google para tu servicio. Estas verificaciones son importantes para evitar que se otorgue acceso a apps cliente no deseadas o configuradas incorrectamente.Si admites varios flujos de OAuth 2.0, también confirma que el
response_typeescode.Verifica si el usuario accedió a tu servicio. Si el usuario no accedió, completar el flujo de acceso o registro del servicio.
Genera un código de autorización que Google usará para acceder a tu API. El código de autorización puede ser cualquier valor de cadena, pero debe ser representar al usuario, al cliente al que pertenece el token y el vencimiento del código el tiempo y que no debe ser adivinable. Por lo general, se emiten autorizaciones los códigos que vencen después de unos 10 minutos.
Confirma que la URL especificada en el parámetro
redirect_uritiene la siguiente forma: YOUR_PROJECT_ID es el ID que se encuentra en la página Configuración del proyecto de la Consola de Actions.https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID
Redireccionar el navegador del usuario a la URL especificada por el Parámetro
redirect_uri. Incluya el código de autorización que que acabas de generar y el valor de estado original, sin modificar, cuando redireccionas Agregando los parámetroscodeystate. A continuación, se muestra un ejemplo de la URL resultante:https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID?code=AUTHORIZATION_CODE&state=STATE_STRING
Controla las solicitudes de intercambio de tokens
El extremo de intercambio de tokens de tu servicio es responsable de dos tipos de tokens intercambios:
- Intercambia códigos de autorización por tokens de acceso y tokens de actualización
- Intercambia tokens de actualización por tokens de acceso
Las solicitudes de intercambio de tokens incluyen los siguientes parámetros:
| Parámetros del extremo de intercambio de tokens | |
|---|---|
client_id |
Una cadena que identifica el origen de la solicitud como Google. Esta cadena debe estar registrados en tu sistema como el identificador único de Google. |
client_secret |
Es una cadena secreta que registraste en Google para tu servicio. |
grant_type |
El tipo de token que se intercambia. Cualquiera de las siguientes opciones
authorization_code o refresh_token. |
code |
Cuando sea grant_type=authorization_code, el código que Google
que se reciban desde el extremo de acceso
o intercambio de tokens. |
redirect_uri |
Cuando es grant_type=authorization_code, este parámetro es el
URL utilizada en la solicitud de autorización inicial. |
refresh_token |
Cuando sea grant_type=refresh_token, el token de actualización de Google
recibidos desde tu extremo de intercambio de tokens. |
Intercambia códigos de autorización por tokens de acceso y tokens de actualización
Después de que el usuario accede y tu extremo de autorización muestra una autorización de corta duración código a Google, Google envía una solicitud a tu extremo de intercambio de token para el código de autorización para un token de acceso y un token de actualización.
Para estas solicitudes, el valor de grant_type es authorization_code, y el valor
code es el valor del código de autorización que le otorgaste a Google.
El siguiente es un ejemplo de una solicitud para intercambiar un código de autorización por un
un token de acceso y un token de actualización:
POST /token HTTP/1.1 Host: oauth2.example.com Content-Type: application/x-www-form-urlencoded client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET&grant_type=authorization_code&code=AUTHORIZATION_CODE&redirect_uri=REDIRECT_URI
Para intercambiar códigos de autorización por un token de acceso y un token de actualización, tu
El extremo de intercambio de tokens responde a las solicitudes POST mediante los siguientes pasos:
- Verifica que
client_ididentifique el origen de la solicitud como uno autorizado. y de queclient_secretcoincida con el valor esperado. - Verifica lo siguiente:
- El código de autorización es válido y no está vencido, y el cliente especificado en la solicitud coincide con el ID de cliente asociado al código de autorización.
- La URL especificada por el parámetro
redirect_uries idéntica según el valor que se usó en la solicitud de autorización inicial.
- Si no puedes verificar todos los criterios anteriores, devuelve una solicitud HTTP
Error 400 de solicitud incorrecta con
{"error": "invalid_grant"}como cuerpo. - De lo contrario, con el ID de usuario del código de autorización, genera una actualización y uno de acceso. Estos tokens pueden ser cualquier valor de cadena, pero deben representar de forma única al usuario y al cliente para el que es el token, y estos no deben no se puedan adivinar. Para los tokens de acceso, registra también la fecha y hora de vencimiento del token (por lo general, una hora después de que se emite el token). Los tokens de actualización no vencen.
- Muestra el siguiente objeto JSON en el cuerpo de la respuesta HTTPS:
{ "token_type": "Bearer", "access_token": "ACCESS_TOKEN", "refresh_token": "REFRESH_TOKEN", "expires_in": SECONDS_TO_EXPIRATION }
Google almacena el token de acceso y el token de actualización para el usuario y registra el vencimiento del token de acceso. Cuando vence el token de acceso, Google usa la actualización para obtener un token de acceso nuevo desde el extremo de intercambio del token.
Intercambia tokens de actualización por tokens de acceso
Cuando vence un token de acceso, Google envía una solicitud a tu extremo de intercambio de token para intercambiar un token de actualización por un token de acceso nuevo.
Para estas solicitudes, el valor de grant_type es refresh_token, y el valor
de refresh_token es el valor del token de actualización que le otorgaste a Google anteriormente.
El siguiente es un ejemplo de una solicitud para intercambiar un token de actualización por un
token de acceso:
POST /token HTTP/1.1 Host: oauth2.example.com Content-Type: application/x-www-form-urlencoded client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
Para intercambiar un token de actualización por un token de acceso, el extremo de intercambio del token
responde a las solicitudes POST ejecutando los siguientes pasos:
- Verifica que
client_ididentifique el origen de la solicitud como Google, y que elclient_secretcoincida con la valor. - Verifica que el token de actualización sea válido y que el ID de cliente especificado en la solicitud coincida con el ID de cliente asociado con el token de actualización.
- Si no puedes verificar todos los criterios anteriores, devuelve una solicitud HTTP
Error 400 de solicitud incorrecta con
{"error": "invalid_grant"}como cuerpo. - De lo contrario, usa el ID de usuario del token de actualización para generar un permiso token. Estos tokens pueden ser cualquier valor de cadena, pero deben representar de manera única el usuario y el cliente al que corresponde el token, y que no se deben poder adivinar. Para los tokens de acceso, registra también la fecha y hora de vencimiento del token (por lo general, una hora después de que se emite el token).
- Devuelve el siguiente objeto JSON en el cuerpo del protocolo HTTPS
respuesta:
{ "token_type": "Portador", “access_token”: “ACCESS_TOKEN”, “expires_in”: SECONDS_TO_EXPIRATION }.
Diseña la interfaz de usuario por voz para el flujo de autenticación
Verifica si el usuario está verificado y comienza el flujo de vinculación de cuentas
- Abre tu proyecto de Actions Builder en la Consola de Actions.
- Crea una escena nueva para iniciar la vinculación de cuentas en tu Acción:
- Haz clic en Scenes.
- Haz clic en el ícono de agregar (+) para agregar una escena nueva.
- En la escena recién creada, haz clic en el ícono de agregar add para Condiciones.
- Agrega una condición que verifique si el usuario asociado a la conversación es un usuario verificado. Si la verificación falla, tu Acción no podrá realizar la vinculación de cuentas durante la conversación y deberá recurrir a proporcionar acceso a la funcionalidad que no requiere la vinculación de cuentas.
- En el campo
Enter new expressionen Condición, ingresa la siguiente lógica:user.verificationStatus != "VERIFIED" - En Transición, selecciona una escena que no requiera la vinculación de la cuenta o una escena que sea el punto de entrada a la funcionalidad solo para invitados.
- En el campo

- Haz clic en el ícono de agregar add para 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 expressionde Condición, 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.
Personaliza la escena de vinculación de cuentas
- En Scenes, selecciona la escena del sistema de vinculación de cuentas.
- Haz clic en Enviar mensaje y agrega una oración breve para describirle al usuario por qué la acción necesita acceder a su identidad (por ejemplo, "Para guardar tus preferencias").
- Haz clic en Guardar.

- En Condiciones, haz clic en Si el usuario completa correctamente la vinculación de la cuenta.
- Configura cómo debe continuar el flujo si el usuario acepta vincular su cuenta. Por ejemplo, llama al webhook para procesar cualquier lógica empresarial personalizada que se requiera y volver a la escena de origen.
- Haz clic en Guardar.

- En Condiciones, haz clic en Si el usuario cancela o descarta la vinculación de la cuenta.
- Configura cómo debe continuar el flujo si el usuario no acepta vincular su cuenta. Por ejemplo, envía un mensaje de confirmación y redirecciona a escenas que proporcionan funcionalidad que no requiere la vinculación de la cuenta.
- Haz clic en Guardar.

- En Condiciones, haz clic en Si se produce un error del sistema o de la red.
- Configura cómo debe continuar el flujo si no se puede completar el flujo de vinculación de cuentas debido a errores del sistema o de red. Por ejemplo, envía un mensaje de confirmación y redirecciona a escenas que proporcionan funcionalidad que no requiere la vinculación de la cuenta.
- Haz clic en Guardar.
Cómo controlar las solicitudes de acceso a los datos
Si la solicitud del Asistente contiene un token de acceso, primero verifica que el token de acceso sea válido (y no haya vencido) y, luego, recupera la cuenta de usuario asociada de tu base de datos.