Vinculação de conta com o Login do Google

O Login do Google para o Assistente oferece a experiência do usuário mais simples e fácil para usuários e desenvolvedores para vinculação e criação de contas. Sua ação pode solicitar acesso ao perfil do Google de um usuário durante uma conversa, incluindo o nome do usuário, o endereço de e-mail e a foto do perfil.

As informações do perfil podem ser usadas para criar uma experiência do usuário personalizada na sua ação. Se você tiver apps em outras plataformas e elas usarem o Login do Google, você também pode encontrar e vincular a uma conta de usuário existente, criar uma nova conta, e estabelecer um canal direto de comunicação com o usuário.

Para vincular a conta com o Login do Google, peça o consentimento do usuário para acessar o perfil do Google. Depois, você usa as informações do perfil da pessoa exemplo, o endereço de e-mail, para identificar o usuário no seu sistema.

Implementar a vinculação de conta do Login do Google

Siga as etapas nas seções abaixo para vincular sua conta do Login do Google Ação.

Configurar o projeto

Para configurar seu projeto para usar a vinculação de conta do Login do Google, siga estas etapas:

  1. Abra o Console do Actions e selecione um projeto.
  2. Clique na guia Desenvolver e escolha Vinculação de contas.
  3. Ative a chave ao lado de Vinculação de contas.
  4. Na seção Criação de conta, selecione Sim.
  5. Em Tipo de vinculação, selecione Login do Google.

  6. Abra Informações do cliente e anote o valor do ID do cliente emitido pelo Google para suas ações.

  7. Clique em Salvar.

Projetar a interface do usuário de voz para o fluxo de autenticação

.

Conferir se o usuário foi verificado e iniciar o fluxo de vinculação da conta

  1. Abra seu projeto do Actions Builder no Console do Actions.
  2. Crie uma cena para iniciar a vinculação da conta na sua ação:
    1. Clique em Cenas.
    2. Clique no ícone adicionar (+) para incluir uma nova cena.
  3. Na cena recém-criada, clique no botão de adição . ícone em Condições.
  4. Adicione uma condição que verifique se o usuário associado à conversa é um um usuário verificado. Se a verificação falhar, a Ação não vai poder fazer a vinculação da conta durante a conversa e devem voltar a fornecer acesso a que não requer vinculação de conta.
    1. No campo Enter new expression, em Condição, digite a seguinte lógica: user.verificationStatus != "VERIFIED"
    2. Em Transição, selecione uma cena que não exija a vinculação da conta ou o uma cena que é o ponto de entrada para a funcionalidade exclusiva para convidados.

  1. Clique no ícone adicionar para Condições.
  2. Adicione uma condição para acionar um fluxo de vinculação de conta se o usuário não tiver uma identidade associada.
    1. No campo Enter new expression, em Condição, digite a seguinte lógica: user.verificationStatus == "VERIFIED"
    2. Em Transição, selecione a cena do sistema Vinculação de contas.
    3. Clique em Salvar.

Depois de salvar, um novo cenário do sistema de vinculação de contas chamado <SceneName>_AccountLinking é adicionado ao seu projeto.

Personalizar o cenário da vinculação da conta

  1. Em Cenas, selecione a cena do sistema de vinculação de contas.
  2. Clique em Enviar solicitação e adicione uma frase curta para descrever ao usuário por que a ação precisa acessar a identidade dela (por exemplo, "Para salvar suas preferências").
  3. Clique em Salvar.

  1. Em Condições, clique em Se o usuário concluir a vinculação da conta.
  2. Configurar como o fluxo deverá proceder se o usuário concordar em vincular a conta. Por exemplo, chame o webhook para processar qualquer lógica de negócios personalizada necessária. e voltar para a cena de origem.
  3. Clique em Salvar.

  1. Em Condições, clique em Se o usuário cancelar ou dispensar a vinculação da conta.
  2. Configurar como o fluxo deve proceder se o usuário não concordar em vincular a do Compute Engine. Por exemplo, envie uma mensagem de confirmação e redirecione para as cenas que fornecem funcionalidades que não exigem a vinculação da conta.
  3. Clique em Salvar.

  1. Em Condições, clique em Se ocorrer um erro no sistema ou na rede.
  2. Configurar como o fluxo vai proceder se não for possível concluído devido a erros do sistema ou da rede. Por exemplo, envie uma mensagem de confirmação e redirecione para as cenas que fornecem funcionalidades que não exigem a vinculação da conta.
  3. Clique em Salvar.

Acessar informações de perfil no back-end

Depois que o usuário autorizar sua ação a acessar o perfil do Google dele, você receberá um token de ID do Google que contenha as informações de perfil do Google do usuário em cada evento subsequente solicitação para sua ação.

Para acessar as informações do perfil do usuário, primeiro é necessário validar e decodificar o token fazendo o seguinte:

  1. Use uma biblioteca de decodificação de JWT em sua linguagem para decodificar o token e usar as chaves públicas do Google (disponíveis no JWK ou PEM) para verificar a assinatura do token.
  2. Verifique se o emissor do token (campo iss no token decodificado) é https://accounts.google.com e que o público (campo aud no token decodificado) é o valor de ID do cliente emitido pelo Google para suas ações, que é atribuído ao seu projeto. no Console do Actions.

Este é um exemplo de 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"
}

Se você usa a biblioteca de fulfillment do Actions on Google para Node.js, ele valida e decodifica o token para você e dá acesso o conteúdo do perfil, conforme mostrado nos snippets de código a seguir.

...
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;
      }
    }
  }
});

Processar solicitações de acesso a dados

Para lidar com solicitações de acesso a dados, verifique se o usuário declarado pelo ID do Google token já está presente no seu banco de dados. O snippet de código a seguir mostra um exemplo de como verificar se os pedidos de um usuário já existem em um banco de dados do 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!');
});