Vinculación de cuentas con OAuth

El tipo de vinculación de OAuth es compatible con dos flujos de OAuth 2.0 estándar de la industria: los flujos de código implícito 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:
    1. 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.
    2. 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.

Implementa la vinculación de cuentas mediante OAuth

Configura el proyecto

Si deseas configurar tu proyecto para que use la vinculación de OAuth, sigue estos pasos:

  1. Abre la Consola de Actions y selecciona el proyecto que deseas usar.
  2. Haz clic en la pestaña Desarrollo y elige Vinculación de cuentas.
  3. Habilita el interruptor que se encuentra junto a Vinculación de cuentas.
  4. En la sección Creación de cuenta, selecciona No, solo quiero permitir la creación de cuentas en mi sitio web.

  5. En Tipo de vinculación, selecciona Implícito y OAuth.

  6. En Información del cliente (Client information), haz lo siguiente:

    • Asigna un valor al ID de cliente emitido por tus acciones a Google para identificar las solicitudes que provienen de Google.
    • Inserta las URL para tus extremos de autorización y de intercambio de tokens.
  1. Haz clic en Guardar.

Implementa tu servidor OAuth

为了支持 OAuth 2.0 隐式流程,您的服务会通过 HTTPS 提供授权端点。此端点负责验证数据访问并从用户那里获得同意。授权端点会向尚未登录的用户呈现登录界面,并记录用户同意所请求的访问。

当您的 Action 需要调用某项服务的已授权 API 时,Google 会使用此端点从您的用户处获取权限,以便代表他们调用这些 API。

由 Google 发起的典型 OAuth 2.0 隐式流会话具有以下流程:

  1. Google 会在用户的浏览器中打开您的授权端点。用户如果尚未登录,则登录;如果用户尚未授予权限,则授予 Google 使用您的 API 访问其数据的权限。
  2. 您的服务会创建访问令牌,并使用附加到请求的访问令牌将用户的浏览器重定向回 Google,从而将其返回给 Google。
  3. Google 会调用您的服务的 API,并为每个请求附加访问令牌。您的服务会验证访问令牌是否授予 Google 访问 API 的授权,然后完成 API 调用。

处理授权请求

当您的 Action 需要通过 OAuth 2.0 隐式流程执行帐号关联时,Google 会通过包含以下参数的请求将用户发送到您的授权端点:

授权端点参数
client_id 您分配给 Google 的客户端 ID。
redirect_uri 您要将该请求的响应发送到的网址。
state 在重定向 URI 中原封不动地传回 Google 的簿记值。
response_type 要在响应中返回的值的类型。对于 OAuth 2.0 隐式流程,响应类型始终为 token

例如,如果您的授权端点位于 https://myservice.example.com/auth,请求可能如下所示:

GET https://myservice.example.com/auth?client_id=GOOGLE_CLIENT_ID&redirect_uri=REDIRECT_URI&state=STATE_STRING&response_type=token

为了让授权端点能够处理登录请求,请执行以下步骤:

  1. 验证 client_idredirect_uri 值,以防止授予对意外或配置错误的客户端应用的访问权限:

    • 确认 client_id 与您分配给 Google 的客户端 ID 匹配。
    • 确认 redirect_uri 参数指定的网址采用以下格式:
      https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID
      YOUR_PROJECT_ID 是在 Actions 控制台的 Project settings 页面上找到的 ID。
  2. 检查用户是否登录了您的服务。如果用户未登录,请完成服务的登录或注册流程。

  3. 生成 Google 将用于访问您的 API 的访问令牌。访问令牌可以是任何字符串值,但它必须唯一地代表用户和令牌所面向的客户端,并且必须不可猜测。

  4. 发送 HTTP 响应,将用户浏览器重定向到 redirect_uri 参数指定的网址。在网址片段中添加以下所有参数:

    • access_token:您刚刚生成的访问令牌
    • token_type:字符串 bearer
    • state:原始请求中的未修改状态值 以下是所生成网址的示例:
      https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID#access_token=ACCESS_TOKEN&token_type=bearer&state=STATE_STRING

Google 的 OAuth 2.0 重定向处理程序将接收访问令牌,并确认 state 值未更改。Google 为您的服务获取访问令牌后,会将该令牌作为 AppRequest 的一部分附加到对您的 Action 的后续调用。

Diseñar la interfaz de usuario de voz para el flujo de autenticación

Comprueba si el usuario está verificado y comienza el flujo de vinculación de cuentas

  1. Abre tu proyecto de Actions Builder en la Consola de Actions.
  2. Crea una escena nueva para comenzar a vincular cuentas en tu acción:
    1. Haz clic en Scenes.
    2. Haz clic en el ícono de agregar (+) para agregar una escena nueva.
  3. En la escena recién creada, haz clic en el ícono de agregar para Conditions.
  4. Agrega una condición que verifique si el usuario asociado con 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ía volver a proporcionar acceso a la funcionalidad que no requiera la vinculación de cuentas.
    1. En el campo Enter new expression, en Condición, ingresa la siguiente lógica: user.verificationStatus != "VERIFIED"
    2. En Transición, selecciona una escena que no requiera la vinculación de una cuenta o una que sea el punto de entrada a la funcionalidad solo para invitados.

  1. Haz clic en el ícono de agregar para Conditions.
  2. Agrega una condición para activar un flujo de vinculación de cuentas si el usuario no tiene una identidad asociada.
    1. En el campo Enter new expression, en Condición, ingresa la siguiente lógica: user.verificationStatus == "VERIFIED"
    2. En Transition, selecciona la escena del sistema Account Linking.
    3. Haz clic en Guardar.

Después de guardar, se agrega a tu proyecto una nueva escena del sistema de vinculación de cuentas llamada <SceneName>_AccountLinking.

Personaliza la escena de vinculación de cuentas

  1. En Scenes, selecciona la escena del sistema de vinculación de cuentas.
  2. Haz clic en Send prompt 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").
  3. Haz clic en Guardar.

  1. En Condiciones, haz clic en Si el usuario completa la vinculación de cuentas correctamente.
  2. 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 que se requiera y realizar la transición a la escena de origen.
  3. Haz clic en Guardar.

  1. En Condiciones, haz clic en Si el usuario cancela o descarta la vinculación de cuentas.
  2. 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 funcionalidades que no requieren la vinculación de cuentas.
  3. Haz clic en Guardar.

  1. En Condiciones, haz clic en Si se produce un error de sistema o red.
  2. Configura cómo debe proceder el flujo si el flujo de vinculación de cuentas no se puede completar debido a errores del sistema o de la red. Por ejemplo, envía un mensaje de confirmación y redirecciona a escenas que proporcionen funcionalidades que no requieren la vinculación de cuentas.
  3. Haz clic en Guardar.

Controla las solicitudes de acceso a los datos

Si la solicitud de Asistente contiene un token de acceso, primero verifica que el token sea válido (y no haya vencido) y, luego, recupera la cuenta de usuario asociada de tu base de datos.