Identifikace návštěvníků a předávání kontextu
Jak oznámit přihlášené uživatele pomocí ReactiveChat('identify'), podepsat userHash pomocí HMAC-SHA256 na vašem serveru, obměnit tajný klíč a předat asistentovi strukturovaný kontext stránky, například produkt nebo košík.
Pokud váš web ví, kdo ho navštěvuje, sdělte to chatu. Váš tým pak v pultu uvidí jméno místo „Návštěvník 4f2a“ a teprve tím se zpřístupní funkce jako zákaznická data a zákaznický portál.
Princip: prohlížeč nic nedokazuje. Cokoli stránka tvrdí přes identify, může kterýkoli návštěvník napodobit v konzoli. Uživatel je potvrzený pouze s podpisem, který vypočítal váš server pomocí tajného klíče, jenž se nikdy nedostane do prohlížeče.
Volání v prohlížeči
ReactiveChat('identify', {
userId: '4711',
email: 'kim@example.com',
name: 'Kim Berger',
userHash: '9c1f…',
exp: 1792503600
});
- userId (řetězec, doporučené) – vaše vlastní trvalé ID uživatele. Nikoli e-mailová adresa ani pořadové číslo, které se může změnit.
- email (řetězec, volitelné) – zobrazuje se v pultu. Potvrzený je pouze tehdy, pokud byl také podepsán (níže).
- name (řetězec, volitelné) – zobrazované jméno v pultu.
- userHash (řetězec, povinné pro potvrzení) – 64 hexadecimálních znaků, vypočítaných na vašem serveru.
- exp (celé číslo, doporučené) – čas vypršení hashe v unixových sekundách, nejvýše 24 hodin v budoucnosti.
Ostatní pole se zahodí. identify může přijít před načtením widgetu; zařadí se do fronty a nevyvolá předčasné načtení. Hodnoty se odešlou při navázání spojení, a pokud už je widget připojený, okamžitě.
Tajný klíč
V účtu v části Projekt → Ověření identity vygenerujete tajný klíč projektu (oprávnění: upravovat projekt). Obsahuje 64 hexadecimálních znaků a v plné podobě se zobrazí právě jednou, poté pouze maskovaný. Uložte ho do prostředí serveru – nikdy do skriptu v prohlížeči, aplikace nebo repozitáře.
Důležité pro výpočet: klíčem HMAC je samotný řetězec o 64 znacích, přesně jak je zobrazený – nikoli bajty z něj dekódované.
Výpočet podpisu
userHash = hex( HMAC_SHA256( secret, userId + "." + exp ) )
Hexadecimální zápis malými písmeny, 64 znaků. S potvrzenou e-mailovou adresou:
userHash = hex( HMAC_SHA256( secret, userId + "." + exp + "." + email ) )
Pouze ve druhém tvaru se e-mailová adresa považuje za potvrzenou. Vyžaduje 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()}
S e-mailovou adresou (PHP):
$userHash = hash_hmac('sha256', $userId . '.' . $exp . '.' . $email, $geheim);
Adresa musí být podepsána přesně tak, jak ji předáváte do identify.
Bez inline skriptu (přísná CSP)
Pokud vaše Content Security Policy nepovoluje inline skripty, vypište hodnoty jako data a zavolejte identify z vlastního souboru se skriptem:
<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)); }
V jednostránkových aplikacích načtěte tři hodnoty ze svého serveru přes fetch po přihlášení.
Co server kontroluje
expje celé číslo (unixové sekundy), leží v budoucnosti a nejvýše 24 hodin dopředu (plus tolerance 5 minut).- Hash odpovídá
userId + "." + exp(nebo tvaru s e-mailem). Velká písmena v hashi se tolerují. - Porovnání probíhá v konstantním čase.
Potvrzený a aktuální je uživatel s platným hashem a exp. Teprve pak získá zákaznická data a zákaznický portál.
Starší tvar bez exp: userHash = HMAC_SHA256(secret, userId) se stále přijímá jako potvrzený, ale nikoli jako aktuální – stačí pro historii konverzací a zobrazení v pultu, nikoli pro zákaznická data. Převeďte stávající integrace na tvar s exp.
Když kontrola selže
Chat funguje dál, ale anonymně. Widget obdrží chybu auth_failed s důvodem v detail.reason:
- no_hash – chybí
userHash. - no_secret – projekt nemá nastavený tajný klíč.
- bad_exp –
expnení platné celé číslo v sekundách (často byly předány milisekundy). - expired –
expleží v minulosti (stránka je dlouho otevřená, nesprávné hodiny serveru). - exp_too_far –
expleží více než 24 hodin v budoucnosti. - bad_hash – hash neodpovídá: nesprávný tajný klíč, nesprávné pořadí,
userIdpodepsané jako číslo místo řetězce, jinak zapsaný e-mail.
Na kartě síťových požadavků ve vývojářských nástrojích je důvod v rámci error spojení WebSocket; init_ok.identity zobrazuje verified a reason.
Nastavení „povolit pouze potvrzené návštěvníky“ neexistuje: nepotvrzení návštěvníci vždy chatují anonymně.
Rotace tajného klíče
- Vygenerovat nový tajný klíč: předchozí zůstává platný dalších 24 hodin. Během této doby zadejte nový klíč na své servery.
- Odstranit: okamžitě zneplatní oba klíče. Všichni uživatelé se pak považují za nepotvrzené, dokud nenastavíte nový tajný klíč.
Změna uživatele a odhlášení
- Pokud zavoláte
identifys jiným uživatelem (například po přepnutí účtu v SPA), widget oddělí rozepsanou zprávu od předchozího uživatele. - Samostatný příkaz pro odhlášení neexistuje. Identita platí pouze pro aktuální zobrazení stránky: po odhlášení poskytujte stránky bez
identify. Konverzace a ID návštěvníka zůstávají v prohlížeči; pokud už na sdíleném zařízení nemá být nic vidět, návštěvník může smazat svá data ve widgetu.
Předávání kontextu
Kromě identity může vaše stránka asistentovi a vašemu týmu sdělit, co se právě děje – například který produkt se zobrazuje nebo co je v košíku. Slouží k tomu track:
ReactiveChat('track', 'warenkorb', {
page_type: 'cart',
cart_value: 129.80,
cart_items: 3,
currency: 'EUR'
});
Přebírají se pouze tato pole; vše ostatní se zahodí:
- Stránka:
url,path,title,referrer,page_type,landing_path - Produkt:
product_id,variant_id,category,price,currency,in_stock - Košík:
cart_value,cart_items - Kampaň:
utm_source,utm_medium,utm_campaign,gclid,msclkid,fbclid - Signály:
intent,intent_confidence,rage_score,scroll_pct,dwell_ms
Adresu, nadpis, odkazující stránku a parametry kampaně widget i tak zaznamenává sám při každé změně stránky. Kontext se předává pouze se souhlasem (Integrace ochrany soukromí). Do těchto polí nezapisujte osobní údaje – k tomu slouží identify.
Mobilní aplikace
V aplikaci předáváte identitu přes JavaScript po načtení WebView, nikdy přes adresu. Také zde se hash počítá na vašem serveru, nikoli v aplikaci: Mobilní aplikace.
آخری بار تازہ کاری: