Anleitung · Entwickler

Persönliche Daten für eingeloggte Besucher

Lassen Sie Ihren Assistenten Fragen beantworten wie "wofür habe ich reserviert?" oder "wie ist der Status meiner Bestellung?" — indem Sie Ihre eigene API im Namen des Besuchers abfragen, der auf Ihrer Website eingeloggt ist.

Der Ansatz ist bewusst einfach und sicher: Ihre Website teilt dem Chatbot mit, wer eingeloggt ist, aber signiert, sodass sich ein Besucher niemals für einen anderen ausgeben kann. Sie haben das in einer Viertelstunde stehen.

Der Kern in einem Satz: Ihr Server berechnet eine Signatur über die Benutzer-ID mit einem Geheimnis, das nur Sie und Codebrouwerij kennen, und gibt diese dem Widget mit. Wir prüfen die Signatur, bevor auch nur irgendetwas Persönliches abgerufen wird.

Schritt 1 — Verifizierung aktivieren und ein Geheimnis generieren

Öffnen Sie Ihren Bot im Portal, gehen Sie zum Tab Aktionen und aktivieren Sie "Persönliche Daten eingeloggter Besucher". Klicken Sie auf Generieren für ein gemeinsames Geheimnis und speichern Sie.

  • Bewahren Sie das Geheimnis wie ein Passwort auf — in einer Umgebungsvariable oder Ihrem Secrets-Store, niemals in Ihrem Frontend-Code.
  • Vermuten Sie, dass es durchgesickert ist? Generieren Sie ein neues Geheimnis; die alten Signaturen werden dann sofort ungültig.

Schritt 2 — Berechnen Sie die Signatur auf Ihrem Server

Berechnen Sie für den eingeloggten Besucher HMAC-SHA256(Geheimnis, Benutzer-ID) und geben Sie das Ergebnis als hexadezimalen Text weiter. Dies geschieht immer server-side — das Geheimnis darf nicht in den Browser.

PHP
<?php
// Das Geheimnis liegt sicher auf deinem Server (aus dem Portal). Niemals im Browser.
$secret   = getenv('CODEBROUWERIJ_CHATBOT_SECRET');
$userId   = (string) $currentUser->id;

// Signiere die Benutzer-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, auf deiner eingeloggten Route:
const secret   = process.env.CODEBROUWERIJ_CHATBOT_SECRET;
const userId   = String(req.user.id);
const userHash = crypto.createHmac('sha256', secret).update(userId).digest('hex');

// Gib userId + userHash an deine View weiter und rendere dort:
// <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

# Z. B. als Context-Processor oder in deiner 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 deinem 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>
Prüfen Sie Ihre Implementierung. Mit dem Geheimnis demo-secret und der Benutzer-ID user-42 muss die Signatur genau diese sein:
0e5cda9a37bbbac18483cc531c37c0fcd29ad35ba29fe5f1a120979a3d7ead8f
Bekommen Sie dasselbe, stimmt Ihr Code. (Großbuchstaben oder Leerzeichen? Achten Sie darauf, dass Sie lowercase hex zurückgeben.)

Schritt 3 — Platzieren Sie das Widget auf Ihren eingeloggten Seiten

Auf Seiten, auf denen der Besucher eingeloggt ist, rendern Sie das Widget mit data-user-id und data-user-hash. Auf öffentlichen Seiten lassen Sie diese Attribute einfach weg — dort arbeitet der Chatbot anonym.

  • data-user-id — die Benutzer-ID aus Ihrem System (wird verifiziert).
  • data-user-hash — die Signatur aus Schritt 2.
  • data-user-email / data-user-name — optional, rein zur Information für eine persönliche Begrüßung.

Schritt 4 — Konfigurieren Sie eine Aktion

Fügen Sie im Portal (Tab Aktionen) eine Aktion hinzu, zum Beispiel get_reservations. Sie teilen dem Assistenten mit, was die Aktion tut und welche API er aufrufen darf. In der URL, den Headern oder dem Body verwenden Sie Platzhalter, die wir server-side aus dem verifizierten Besucher ausfüllen:

  • {{user.id}} — die verifizierte Benutzer-ID
  • {{user.email}} — die E-Mail-Adresse, falls mitgegeben
  • {{user.token}} — ein eventuell weitergegebenes Token (siehe unten)
  • {{naam}} — ein Parameter, den der Assistent selbst ausfüllt (z. B. eine Bestellnummer)

Eine Beispiel-URL für "meine Reservierungen":

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

Wichtig: Ihre API muss selbst prüfen, dass die abgefragten Daten wirklich zu diesem Benutzer gehören. Wir liefern die verifizierte Identität; die Autorisierung bleibt bei Ihnen — so ist es doppelt abgesichert.

Alternative: ein Token weitergeben

Geben Sie lieber ein bestehendes Token mit (zum Beispiel ein kurzlebiges JWT, das Ihre API bereits validieren kann)? Setzen Sie dann data-user-token auf das Widget. Wir senden dieses Token an Ihre API mit (zum Beispiel als Authorization: Bearer {{user.token}}), die selbst den Benutzer daraus ableitet. Verwenden Sie eine kurze Lebensdauer und die richtige Audience.

Sicherheit in Kürze

  • Das Geheimnis liegt nur auf Ihrem Server. Setzen Sie es niemals in HTML, JavaScript oder ein öffentliches Repository.
  • Die Signatur wird pro Besucher server-side berechnet — nicht im Browser.
  • Wir vergleichen die Signatur in konstanter Zeit und verweigern persönliche Aktionen, sobald sie nicht stimmt oder fehlt.
  • Aktionen laufen auf unserem Server mit einem kurzen Time-out und einer Sperre für interne Adressen; Ihre API-Schlüssel bleiben außerhalb der Sichtweite des Besuchers.
  • Persönliche Aktionen sind ab dem Crew-Abonnement verfügbar.
Muss ich pro Seite eine neue Signatur berechnen?

Sie berechnen sie pro eingeloggtem Besucher beim Rendern der Seite. Die Signatur gehört zur Benutzer-ID, also bleibt sie gültig, solange diese gleich bleibt. Ändert sich Ihr Geheimnis, erneuern Sie sie automatisch bei der nächsten Seitenanzeige.

Was passiert, wenn die Signatur nicht stimmt?

Dann behandelt der Chatbot den Besucher als anonym: Persönliche Aktionen werden verweigert und der Assistent bittet freundlich, sich zuerst einzuloggen. Gewöhnliche Fragen werden ganz normal beantwortet.

Funktioniert das auch ohne die Besucher-ID, nur mit einem Token?

Ja. Geben Sie dann data-user-token mit; Ihre eigene API validiert das Token und bestimmt den Benutzer. Praktisch, wenn Sie bereits mit JWTs oder Sitzungstokens arbeiten.

Welche API-Systeme werden unterstützt?

Jede HTTP-/JSON-API. Sie stellen Methode, URL, Header und gegebenenfalls einen Body ein. Die Authentifizierung regeln Sie mit einem Header (zum Beispiel einem API-Schlüssel) oder über das weitergegebene Token.

Bereit zum Verbinden?

Schalten Sie die Personalisierung ein und fügen Sie Ihre erste Aktion im Portal hinzu.

Zum Portal