Ідентифікація відвідувачів і контекст
Як повідомляти користувачів через ReactiveChat('identify'), підписувати userHash з HMAC-SHA256 на сервері, виконувати ротацію секрету та передавати асистенту структурований контекст товару чи кошика.
Якщо сайт знає, хто його відвідує, повідомте чату. Тоді команда бачить у панелі ім’я замість «Відвідувач 4f2a», і стають можливими такі функції, як дані клієнтів та клієнтський портал.
Принцип: браузер нічого не доводить. Усе, що сторінка заявляє через identify, будь-який відвідувач може підробити в консолі. Користувач вважається підтвердженим лише з підписом, який ваш сервер обчислив із секретом, що ніколи не потрапляє до браузера.
Виклик у браузері
ReactiveChat('identify', {
userId: '4711',
email: 'kim@example.com',
name: 'Kim Berger',
userHash: '9c1f…',
exp: 1792503600
});
- userId (рядок, рекомендований) — ваш власний постійний ID користувача. Не електронна адреса й не порядковий номер, який може змінитися.
- email (рядок, необов’язковий) — показується в панелі операторів. Підтверджений лише якщо теж підписаний (нижче).
- name (рядок, необов’язковий) — відображуване ім’я в панелі.
- userHash (рядок, обов’язковий для підтвердження) — 64 шістнадцяткові символи, обчислені на сервері.
- exp (ціле число, рекомендований) — строк дії хешу в секундах Unix, щонайбільше на 24 години вперед.
Інші поля відкидаються. identify можна викликати до завантаження віджета; він потрапляє до черги й не запускає раннього завантаження. Значення надсилаються під час встановлення з’єднання, а якщо віджет уже підключений — негайно.
Секрет
В обліковому записі в розділі Проєкт → Підтвердження особи ви створюєте секрет проєкту (право: редагувати проєкт). Він складається з 64 шістнадцяткових символів і показується повністю рівно один раз, потім лише замасковано. Збережіть його в середовищі сервера — ніколи в браузерному скрипті, застосунку чи репозиторії.
Важливо для обчислення: ключ HMAC — сам рядок із 64 символів, точно як показаний, а не декодовані з нього байти.
Обчислення підпису
userHash = hex( HMAC_SHA256( secret, userId + "." + exp ) )
Шістнадцятковий запис малими літерами, 64 символи. З підтвердженою електронною адресою:
userHash = hex( HMAC_SHA256( secret, userId + "." + exp + "." + email ) )
Лише в другій формі електронна адреса вважається підтвердженою. Вона потребує 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()}
З електронною адресою (PHP):
$userHash = hash_hmac('sha256', $userId . '.' . $exp . '.' . $email, $geheim);
Адресу потрібно підписати саме так, як ви передаєте її до identify.
Без вбудованого скрипту (сувора CSP)
Якщо Content Security Policy не дозволяє вбудовані скрипти, виведіть значення як дані й викличте identify із власного файлу скрипту:
<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)); }
В односторінкових застосунках отримуйте три значення із сервера через fetch після входу.
Що перевіряє сервер
exp— ціле число (секунди Unix), у майбутньому й щонайбільше на 24 години вперед (плюс 5 хвилин допуску).- Хеш відповідає
userId + "." + exp(або формі з поштою). Великі літери в хеші допускаються. - Порівняння виконується за сталий час.
Підтверджений і актуальний — користувач із дійсним хешем і exp. Лише тоді доступні дані клієнтів та клієнтський портал.
Стара форма без exp: userHash = HMAC_SHA256(secret, userId) і далі приймається як підтверджена, але не актуальна; її достатньо для історії розмов і показу в панелі, але не для даних клієнтів. Переведіть наявні інтеграції на форму з exp.
Коли перевірка невдала
Чат продовжує працювати, але анонімно. Віджет отримує помилку auth_failed із причиною в detail.reason:
- no_hash — немає
userHash. - no_secret — для проєкту не налаштовано секрет.
- bad_exp —
expне є дійсним цілим числом у секундах (часто передано мілісекунди). - expired —
expу минулому (сторінка довго відкрита, неправильний годинник сервера). - exp_too_far —
expбільш як на 24 години вперед. - bad_hash — хеш не збігається: неправильний секрет чи порядок,
userIdпідписано числом замість рядка, інакше записана електронна адреса.
На вкладці мережі інструментів розробника причина є в кадрі error з’єднання WebSocket; init_ok.identity показує verified і reason.
Налаштування «дозволити лише підтверджених відвідувачів» немає: непідтверджені завжди спілкуються анонімно.
Ротація секрету
- Створити новий секрет: попередній залишається дійсним ще 24 години. Протягом цього часу задайте новий на серверах.
- Видалити: негайно робить обидва недійсними. Усі користувачі вважаються непідтвердженими до створення нового секрету.
Зміна користувача й вихід
- Якщо викликати
identifyз іншим користувачем (наприклад після зміни облікового запису в SPA), віджет відокремлює чернетку введення від попереднього користувача. - Окремої команди виходу немає. Ідентифікація діє лише для поточного перегляду сторінки: після виходу надавайте сторінки без
identify. Розмова й ID відвідувача залишаються в браузері; якщо на спільному пристрої більше нічого не повинно бути видно, відвідувач може видалити свої дані у віджеті.
Передавання контексту
Окрім ідентифікації, сторінка може повідомити асистенту й команді, що відбувається зараз, наприклад який товар показано чи що є в кошику. Це працює через track:
ReactiveChat('track', 'warenkorb', {
page_type: 'cart',
cart_value: 129.80,
cart_items: 3,
currency: 'EUR'
});
Приймаються лише ці поля; решта відкидається:
- Сторінка:
url,path,title,referrer,page_type,landing_path - Товар:
product_id,variant_id,category,price,currency,in_stock - Кошик:
cart_value,cart_items - Кампанія:
utm_source,utm_medium,utm_campaign,gclid,msclkid,fbclid - Сигнали:
intent,intent_confidence,rage_score,scroll_pct,dwell_ms
Віджет і так сам записує адресу, заголовок, referrer і параметри кампанії за кожної зміни сторінки. Контекст передається лише за згодою (Інтеграція конфіденційності). Не вписуйте персональних даних у ці поля — для них призначено identify.
Мобільні застосунки
У застосунку ідентифікація передається через JavaScript після завантаження WebView, ніколи через адресу. Тут хеш також обчислюється на сервері, а не в застосунку: Мобільні застосунки.
Далі: Кінцева точка даних клієнтів · SPA та переходи між сторінками
Оновлено: