Vinculación de cuentas con el Acceso con Google

El Acceso con Google para el Asistente proporciona la experiencia del usuario más sencilla y sin inconvenientes a los usuarios y desarrolladores respecto de la vinculación y creación de cuentas. Tu acción puede solicitar acceso al perfil de Google de tu usuario durante una conversación incluidos el nombre, la dirección de correo electrónico y la foto de perfil del usuario.

La información del perfil se puede usar para crear una experiencia del usuario personalizada en tu Action. Si tienes apps en otras plataformas y usan Acceso con Google, Puedes buscar la cuenta de un usuario existente y vincularla, crear una cuenta nueva y establecer un canal directo de comunicación con el usuario.

Para vincular la cuenta con el Acceso con Google, le pides al usuario que dé su consentimiento para acceder a su perfil de Google. Luego, usarás la información de su perfil para ejemplo, su dirección de correo electrónico, para identificar al usuario en su sistema.

Implementa la vinculación de cuentas de Acceso con Google

Sigue los pasos de las siguientes secciones para agregar la vinculación de la cuenta de Acceso con Google a tu Acción.

Configura el proyecto

Si deseas configurar tu proyecto para usar la vinculación de cuentas de Acceso con Google, sigue estos pasos:

  1. Abre la Consola de Actions y selecciona un proyecto.
  2. Haz clic en la pestaña Desarrollar y elige Vinculación de cuentas.
  3. Habilita el interruptor junto a Vinculación de cuentas.
  4. En la sección Creación de la cuenta, selecciona .
  5. En Tipo de vinculación, selecciona Acceso con Google.

  6. Abre Información del cliente y toma nota del valor del ID de cliente que emite Google para tus Acciones.

  7. Haz clic en Guardar.

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

Comprueba si el usuario está verificado y, luego, inicia el flujo de vinculación de cuentas

  1. Abre tu proyecto de Actions Builder en la Consola de Actions.
  2. Crea una nueva escena para comenzar la vinculación de cuentas en tu acción:
    1. Haz clic en Escenas.
    2. Haz clic en el ícono de agregar (+) para agregar una escena nueva.
  3. En la escena recién creada, haz clic en el botón Agregar de Condiciones.
  4. Agregar una condición que verifique si el usuario asociado con la conversación es un un usuario verificado. Si falla la verificación, tu acción no podrá vincular la cuenta durante la conversación, y debería recurrir a brindar acceso a que no requiere 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 cuentas. una escena que es el punto de entrada a la funcionalidad solo para invitados.

  1. Haz clic en el ícono para agregar de Conditions.
  2. Agregar 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 creará una nueva escena del sistema de vinculación de cuentas llamada <SceneName>_AccountLinking. se agrega a tu proyecto.

Cómo personalizar el ambiente de vinculación de cuentas

  1. En Scenes, selecciona la escena del sistema de vinculación de cuentas.
  2. Haz clic en Enviar mensaje y agrega una oración corta para describir 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 la cuenta.
  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 volver 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. Configurar cómo debe proceder el flujo si el usuario no acepta vincular su de servicio predeterminada. Por ejemplo, envía un mensaje de confirmación y redirecciona a escenas que proporcionan funciones que no requieren la vinculación de cuentas.
  3. Haz clic en Guardar.

  1. En Condiciones, haz clic en Si se produce un error en el sistema o la red.
  2. Configurar el procedimiento del flujo si no se puede realizar la vinculación de cuentas completado debido a errores del sistema o de red. Por ejemplo, envía un mensaje de confirmación y redirecciona a escenas que proporcionan funciones que no requieren la vinculación de cuentas.
  3. Haz clic en Guardar.

Cómo acceder a la información del perfil en tu backend

Una vez que el usuario autorice tu acción para acceder a su perfil de Google, recibirás un token de ID de Google que contenga la información de perfil de Google del usuario en cada una solicitud a la acción.

Para acceder a la información del perfil del usuario, primero debes validar y decodificar el token haciendo lo siguiente:

  1. Usa una biblioteca de decodificación JWT para que tu lenguaje decodifique el token y usa las claves públicas de Google (disponibles en JWK o PEM) para verificar la firma del token.
  2. Verifica que la entidad emisora del token (campo iss del token decodificado) sea https://accounts.google.com y que el público (campo aud del token decodificado) es el valor de ID de cliente que emite Google a tus Acciones, que se asigna a tu proyecto en la Consola de Actions.

El siguiente es un ejemplo de un token decodificado:

{
  "sub": 1234567890,        // The unique ID of the user's Google Account
  "iss": "https://accounts.google.com",        // The token's issuer
  "aud": "123-abc.apps.googleusercontent.com", // Client ID assigned to your Actions project
  "iat": 233366400,         // Unix timestamp of the token's creation time
  "exp": 233370000,         // Unix timestamp of the token'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"
}

Si usas la biblioteca de entregas de Actions on Google para Node.js, haz lo siguiente: se encarga de validar y decodificar el token, y te da acceso a el contenido del perfil, como se muestra en los siguientes fragmentos de código.

...
const app = conversation({
  // REPLACE THE PLACEHOLDER WITH THE CLIENT_ID OF YOUR ACTIONS PROJECT
  clientId: CLIENT_ID,
});
...
// Invoked on successful completion of account linking flow, check if we need to
// create a Firebase user.
app.handle('linkAccount', async conv => {
  let payload = conv.headers.authorization;
  if (payload) {
  // Get UID for Firebase auth user using the email of the user
    const email = payload.email;
    if (!conv.user.params.uid && email) {
      try {
        conv.user.params.uid = (await auth.getUserByEmail(email)).uid;
      } catch (e) {
        if (e.code !== 'auth/user-not-found') {
          throw e;
        }
        // If the user is not found, create a new Firebase auth user
        // using the email obtained from Google Assistant
        conv.user.params.uid = (await auth.createUser({email})).uid;
      }
    }
  }
});

Maneja solicitudes de acceso a los datos

Para controlar la solicitud de acceso a los datos, solo verifica que el usuario afirmado por el ID de Google token ya está presente en tu base de datos. El siguiente fragmento de código muestra Este es un ejemplo de cómo verificar si los pedidos de un usuario ya existen en una base de datos de Firestore:

...
app.handle('Place_Order', async conv => {
  const order = conv.session.params.order;
  const userDoc = dbs.user.doc(conv.user.params.uid);
  const orderHistory = userDoc.collection("orderHistory");
  if (orderHistory) {
    // Order history exists, so the user already placed an order.
    // Update counter for order type.
    await orderHistory.doc(order).update({ count: admin.firestore.FieldValue.increment(1)});
  } else {
    // First order they place
    await orderHistory.doc(order).set({ option: order, count: 1});
    options.forEach(opt => {
      if (opt != order) {
        orderHistory.doc(opt).set({ option: opt, count: 0});
      }
    });
  }
  return conv.add(`Your ${order} has been placed. ` +
      'Thanks for using Boba Bonanza, see you soon!');
});