Manual · programadores

Dados pessoais para visitantes autenticados

Deixa o teu assistente responder a perguntas como "para o que é que reservei?" ou "qual é o estado da minha encomenda?" — consultando a tua própria API em nome do visitante que está autenticado no teu site.

A abordagem é deliberadamente simples e segura: o teu site diz ao chatbot quem está autenticado, mas de forma assinada, para que um visitante nunca se possa fazer passar por outro. Tens isto a funcionar num quarto de hora.

O essencial numa frase: o teu servidor calcula uma assinatura sobre o id de utilizador com um segredo que só tu e a Codebrouwerij conhecem, e dá-o ao widget. Nós verificamos a assinatura antes de seja o que for de pessoal ser obtido.

Passo 1 — Ativa a verificação e gera um segredo

Abre o teu bot no portal, vai ao separador Ações e ativa "Dados pessoais de visitantes autenticados". Clica em Gerar para um segredo partilhado e guarda.

  • Guarda o segredo como uma palavra-passe — numa variável de ambiente ou no teu secrets-store, nunca no código do teu front-end.
  • Suspeitas que tenha vazado? Gera um novo segredo; as assinaturas antigas ficam então imediatamente inválidas.

Passo 2 — Calcula a assinatura no teu servidor

Calcula para o visitante autenticado HMAC-SHA256(geheim, gebruikers-id) e passa o resultado como texto hexadecimal. Isto acontece sempre do lado do servidor — o segredo não pode entrar no navegador.

PHP
<?php
// Het geheim staat veilig op je server (uit de portal). Nooit in de browser.
$secret   = getenv('CODEBROUWERIJ_CHATBOT_SECRET');
$userId   = (string) $currentUser->id;

// Onderteken de gebruikers-id.
$userHash = hash_hmac('sha256', $userId, $secret);
?>
<script src="https://aqivo.chat/embed.js"
        data-bot-id="JOUW-BOT-ID"
        data-user-id="<?= htmlspecialchars($userId) ?>"
        data-user-hash="<?= $userHash ?>"
        data-user-email="<?= htmlspecialchars($currentUser->email) ?>"
        async></script>
Node.js
const crypto = require('crypto');

// Server-side, op je ingelogde route:
const secret   = process.env.CODEBROUWERIJ_CHATBOT_SECRET;
const userId   = String(req.user.id);
const userHash = crypto.createHmac('sha256', secret).update(userId).digest('hex');

// Geef userId + userHash door aan je view en render daar:
// <script src="https://aqivo.chat/embed.js"
//   data-bot-id="JOUW-BOT-ID"
//   data-user-id="${userId}" data-user-hash="${userHash}" async></script>
.NET (C#)
@using System.Security.Cryptography
@using System.Text
@{
    var secret   = Configuration["CodebrouwerijChatbot:Secret"];
    var userId   = User.FindFirstValue(ClaimTypes.NameIdentifier);

    using var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(secret));
    var userHash   = Convert.ToHexString(
        hmac.ComputeHash(Encoding.UTF8.GetBytes(userId))).ToLowerInvariant();
}
<script src="https://aqivo.chat/embed.js"
        data-bot-id="JOUW-BOT-ID"
        data-user-id="@userId"
        data-user-hash="@userHash"
        async></script>
Python
import hmac, hashlib
from django.conf import settings

# Bijv. als context-processor of in je view:
def chatbot_context(request):
    secret    = settings.CODEBROUWERIJ_CHATBOT_SECRET.encode()
    user_id   = str(request.user.id)
    user_hash = hmac.new(secret, user_id.encode(), hashlib.sha256).hexdigest()
    return {"cb_user_id": user_id, "cb_user_hash": user_hash}

# In je template:
# <script src="https://aqivo.chat/embed.js"
#   data-bot-id="JOUW-BOT-ID"
#   data-user-id="{{ cb_user_id }}" data-user-hash="{{ cb_user_hash }}" async></script>
Verifica a tua implementação. Com o segredo demo-secret e o id de utilizador user-42 a assinatura deve ser exatamente esta:
0e5cda9a37bbbac18483cc531c37c0fcd29ad35ba29fe5f1a120979a3d7ead8f
Obténs o mesmo? Então o teu código está correto. (Maiúsculas ou espaços? Garante que devolves hex em minúsculas.)

Passo 3 — Coloca o widget nas tuas páginas autenticadas

Nas páginas onde o visitante está autenticado, renderizas o widget com data-user-id e data-user-hash. Nas páginas públicas omites simplesmente esses atributos — aí o chatbot funciona de forma anónima.

  • data-user-id — o id de utilizador do teu sistema (é verificado).
  • data-user-hash — a assinatura do passo 2.
  • data-user-email / data-user-name — opcional, puramente informativo para uma saudação pessoal.

Passo 4 — Configura uma ação

Adiciona no portal (separador Ações) uma ação, por exemplo get_reservations. Dizes ao assistente o que a ação faz e que API pode invocar. No URL, nos cabeçalhos ou no corpo usas marcadores de posição que nós preenchemos do lado do servidor a partir do visitante verificado:

  • {{user.id}} — o id de utilizador verificado
  • {{user.email}} — o endereço de e-mail, se fornecido
  • {{user.token}} — um eventual token transmitido (ver abaixo)
  • {{naam}} — um parâmetro que o próprio assistente preenche (p. ex. um número de encomenda)

Um URL de exemplo para "as minhas reservas":

https://jouwsite.nl/api/me/reservations?uid={{user.id}}

Importante: a tua API tem de verificar ela própria que os dados solicitados pertencem mesmo a este utilizador. Nós fornecemos a identidade verificada; a autorização fica do teu lado — assim fica com dupla tranca.

Alternativa: transmitir um token

Preferes transmitir um token existente (por exemplo, um JWT de curta duração que a tua API já consegue validar)? Então coloca data-user-token no widget. Nós enviamos esse token para a tua API (por exemplo, como Authorization: Bearer {{user.token}}), que deduz dele o próprio utilizador. Usa uma duração curta e a audience correta.

Segurança em resumo

  • O segredo fica apenas no teu servidor. Nunca o coloques em HTML, JavaScript ou num repositório público.
  • A assinatura é calculada por visitante do lado do servidor — não no navegador.
  • Nós comparamos a assinatura em tempo constante e recusamos ações pessoais assim que ela não está correta ou está ausente.
  • As ações correm no nosso servidor com um tempo-limite curto e um bloqueio de endereços internos; as tuas chaves de API ficam fora da vista do visitante.
  • As ações pessoais estão disponíveis a partir do plano Crew.
Tenho de calcular uma nova assinatura por página?

Calcula-la por visitante autenticado ao renderizar a página. A assinatura corresponde ao id de utilizador, por isso enquanto este se mantiver igual, a assinatura continua válida. Se mudares o teu segredo, renová-las automaticamente na próxima apresentação da página.

O que acontece se a assinatura não estiver correta?

Então o chatbot trata o visitante como anónimo: as ações pessoais são recusadas e o assistente pede gentilmente que se autentique primeiro. As perguntas normais são respondidas normalmente.

Isto também funciona sem o id de visitante, apenas com um token?

Sim. Transmite então data-user-token; a tua própria API valida o token e determina o utilizador. Prático se já trabalhas com JWT ou tokens de sessão.

Que sistemas de API são suportados?

Qualquer API HTTP/JSON. Defines o método, o URL, os cabeçalhos e, eventualmente, um corpo. A autenticação resolves com um cabeçalho (por exemplo, uma chave de API) ou através do token transmitido.

Pronto para ligar?

Ativa a personalização e adiciona a tua primeira ação no portal.

Para o portal