Identifiera besökare och skicka kontext
Så identifierar du inloggade användare med ReactiveChat('identify'), signerar userHash med HMAC-SHA256 på servern, roterar hemligheten och ger assistenten strukturerad sidkontext som produkt eller varukorg.
Om din webbplats vet vem som är där, berätta det för chatten. Teamet ser då ett namn i agentpanelen i stället för ”Besökare 4f2a”, och funktioner som kunddata och kundportalen blir över huvud taget möjliga.
Principen: webbläsaren bevisar inget. Vad en sida än påstår via identify kan vilken besökare som helst förfalska i konsolen. En användare räknas som bekräftad först med en signatur som din server har beräknat med en hemlighet som aldrig når webbläsaren.
Anropet i webbläsaren
ReactiveChat('identify', {
userId: '4711',
email: 'kim@example.com',
name: 'Kim Berger',
userHash: '9c1f…',
exp: 1792503600
});
- userId (sträng, rekommenderad) – ditt eget beständiga ID för användaren. Ingen e-postadress, inget löpnummer som kan ändras.
- email (sträng, valfri) – visas i agentpanelen. Den är bekräftad bara om den också signerats (nedan).
- name (sträng, valfri) – visningsnamn i agentpanelen.
- userHash (sträng, krävs för bekräftelse) – 64 hexadecimala tecken, beräknas på din server.
- exp (heltal, rekommenderat) – hashens utgångstid i Unix-sekunder, högst 24 timmar framåt i tiden.
Andra fält slopas. identify kan komma innan widgeten har laddats; det läggs i kön och utlöser ingen tidigare laddning. Värdena skickas med när anslutningen upprättas och, om widgeten redan är ansluten, omedelbart.
Hemligheten
I kontot under Projekt → Identitetsverifiering genererar du projektets hemlighet (behörighet: redigera projektet). Den består av 64 hexadecimala tecken och visas i sin helhet exakt en gång, därefter bara maskerad. Lägg den i serverns miljö – aldrig i ett webbläsarskript, en app eller ett kodarkiv.
Viktigt för beräkningen: HMAC-nyckeln är själva strängen på 64 tecken, exakt som den visas – inte de byte som avkodas från den.
Beräkna signaturen
userHash = hex( HMAC_SHA256( secret, userId + "." + exp ) )
Hexadecimalt med gemener, 64 tecken. Med bekräftad e-postadress:
userHash = hex( HMAC_SHA256( secret, userId + "." + exp + "." + email ) )
Bara i den andra formen räknas e-postadressen som bekräftad. Den kräver exp.
PHP:
<?php
$geheim = getenv('RC_IDENT_SECRET'); // 64 hex characters from the account
$userId = (string) $kunde->id;
$exp = time() + 3600; // at most 24 h
$userHash = hash_hmac('sha256', $userId . '.' . $exp, $geheim);
?>
<script nonce="<?= $cspNonce ?>">
ReactiveChat('identify', {
userId: <?= json_encode($userId) ?>,
userHash: <?= json_encode($userHash) ?>,
exp: <?= (int) $exp ?>
});
</script>
Node.js:
const crypto = require('crypto');
function rcIdentitaet(kunde) {
const userId = String(kunde.id);
const exp = Math.floor(Date.now() / 1000) + 3600;
const userHash = crypto.createHmac('sha256', process.env.RC_IDENT_SECRET)
.update(userId + '.' + exp)
.digest('hex');
return { userId, userHash, exp };
}
Python:
import hmac, hashlib, os, time
def rc_identitaet(kunde_id: str) -> dict:
exp = int(time.time()) + 3600
msg = f"{kunde_id}.{exp}".encode()
key = os.environ["RC_IDENT_SECRET"].encode() # the hex string as text
return {"userId": kunde_id, "exp": exp,
"userHash": hmac.new(key, msg, hashlib.sha256).hexdigest()}
Med e-postadress (PHP):
$userHash = hash_hmac('sha256', $userId . '.' . $exp . '.' . $email, $geheim);
Adressen måste signeras exakt så som du skickar den till identify.
Utan inbäddat skript (strikt CSP)
Om din Content Security Policy inte tillåter inbäddade skript skriver du ut värdena som data och anropar identify från en egen skriptfil:
<meta name="rc-ident" content='{"userId":"4711","userHash":"9c1f…","exp":1792503600}'>
// /js/chat-ident.js
var m = document.querySelector('meta[name="rc-ident"]');
if (m) { ReactiveChat('identify', JSON.parse(m.content)); }
I ensidesappar hämtar du de tre värdena från servern via fetch efter inloggning.
Vad servern kontrollerar
expär ett heltal (Unix-sekunder), ligger i framtiden och högst 24 timmar framåt (plus 5 minuters tolerans).- Hashen stämmer med
userId + "." + exp(eller formen med e-post). Versaler i hashen godtas. - Jämförelsen sker i konstant tid.
Bekräftad och aktuell är en användare med giltig hash och exp. Först då får användaren kunddata och kundportalen.
Äldre form utan exp: userHash = HMAC_SHA256(secret, userId) godtas fortfarande som bekräftad, men inte som aktuell – den räcker för konversationshistoriken och visningen i agentpanelen, inte för kunddata. Byt befintliga integrationer till formen med exp.
När kontrollen misslyckas
Chatten fortsätter fungera, men anonymt. Widgeten får felet auth_failed med en orsak i detail.reason:
- no_hash –
userHashsaknas. - no_secret – ingen hemlighet har ställts in för projektet.
- bad_exp –
expär inget giltigt heltal i sekunder (ofta: millisekunder skickades). - expired –
expligger i det förflutna (sidan har varit öppen länge, serverns klocka går fel). - exp_too_far –
expligger mer än 24 timmar framåt i tiden. - bad_hash – hashen stämmer inte: fel hemlighet, fel ordning,
userIdsignerat som tal i stället för sträng, e-postadressen skriven annorlunda.
På nätverksfliken i utvecklarverktygen finns orsaken i WebSocket-anslutningens error-ram; init_ok.identity visar verified och reason.
Det finns ingen inställning för ”tillåt bara bekräftade besökare”: obekräftade besökare chattar alltid som anonyma besökare.
Rotera hemligheten
- Generera ny hemlighet: den föregående förblir giltig i ytterligare 24 timmar. Ange den nya på servrarna inom den tiden.
- Ta bort: gör båda omedelbart ogiltiga. Alla användare räknas då som obekräftade tills en ny hemlighet har ställts in.
Byta användare och logga ut
- Om du anropar
identifymed en annan användare (till exempel efter kontobyte i en SPA) skiljer widgeten inmatningsutkastet från den föregående användarens. - Det finns inget särskilt utloggningskommando. Identiteten gäller bara den aktuella sidvisningen: efter utloggning visar du sidor utan
identify. Konversations- och besökar-ID finns kvar i webbläsaren; om inget längre ska visas på en delad enhet kan besökaren radera sina uppgifter i widgeten.
Skicka kontext
Förutom identiteten kan sidan berätta för assistenten och teamet vad som händer just nu – till exempel vilken produkt som visas eller vad som finns i varukorgen. Det fungerar via track:
ReactiveChat('track', 'warenkorb', {
page_type: 'cart',
cart_value: 129.80,
cart_items: 3,
currency: 'EUR'
});
Bara dessa fält tas med; allt annat slopas:
- Sida:
url,path,title,referrer,page_type,landing_path - Produkt:
product_id,variant_id,category,price,currency,in_stock - Varukorg:
cart_value,cart_items - Kampanj:
utm_source,utm_medium,utm_campaign,gclid,msclkid,fbclid - Signaler:
intent,intent_confidence,rage_score,scroll_pct,dwell_ms
Widgeten registrerar ändå adress, titel, referrer och kampanjparametrar själv vid varje sidbyte. Kontext skickas bara med samtycke (Integrera integritetsskydd). Skriv inga personuppgifter i dessa fält – det är vad identify är till för.
Mobilappar
I en app skickar du identiteten via JavaScript efter att WebView har laddats, aldrig via adressen. Även här beräknas hashen på servern, inte i appen: Mobilappar.
Nästa: Slutpunkt för kunddata · SPA och sidbyten
آخرین بهروزرسانی: