Чим ми можемо допомогти?

Стисло опишіть питання; ми відповімо електронною поштою.

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.
На головну

Ідентифікація відвідувачів і контекст

Як повідомляти користувачів через ReactiveChat('identify'), підписувати userHash з HMAC-SHA256 на сервері, виконувати ротацію секрету та передавати асистенту структурований контекст товару чи кошика.

Якщо сайт знає, хто його відвідує, повідомте чату. Тоді команда бачить у панелі ім’я замість «Відвідувач 4f2a», і стають можливими такі функції, як дані клієнтів та клієнтський портал.

Принцип: браузер нічого не доводить. Усе, що сторінка заявляє через identify, будь-який відвідувач може підробити в консолі. Користувач вважається підтвердженим лише з підписом, який ваш сервер обчислив із секретом, що ніколи не потрапляє до браузера.

Виклик у браузері

ReactiveChat('identify', {
  userId:   '4711',
  email:    'kim@example.com',
  name:     'Kim Berger',
  userHash: '9c1f…',
  exp:      1792503600
});

Інші поля відкидаються. 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. Лише тоді доступні дані клієнтів та клієнтський портал.

Стара форма без exp: userHash = HMAC_SHA256(secret, userId) і далі приймається як підтверджена, але не актуальна; її достатньо для історії розмов і показу в панелі, але не для даних клієнтів. Переведіть наявні інтеграції на форму з exp.

Коли перевірка невдала

Чат продовжує працювати, але анонімно. Віджет отримує помилку auth_failed із причиною в detail.reason:

На вкладці мережі інструментів розробника причина є в кадрі error з’єднання WebSocket; init_ok.identity показує verified і reason.

Налаштування «дозволити лише підтверджених відвідувачів» немає: непідтверджені завжди спілкуються анонімно.

Ротація секрету

Зміна користувача й вихід

Передавання контексту

Окрім ідентифікації, сторінка може повідомити асистенту й команді, що відбувається зараз, наприклад який товар показано чи що є в кошику. Це працює через track:

ReactiveChat('track', 'warenkorb', {
  page_type: 'cart',
  cart_value: 129.80,
  cart_items: 3,
  currency: 'EUR'
});

Приймаються лише ці поля; решта відкидається:

Віджет і так сам записує адресу, заголовок, referrer і параметри кампанії за кожної зміни сторінки. Контекст передається лише за згодою (Інтеграція конфіденційності). Не вписуйте персональних даних у ці поля — для них призначено identify.

Мобільні застосунки

У застосунку ідентифікація передається через JavaScript після завантаження WebView, ніколи через адресу. Тут хеш також обчислюється на сервері, а не в застосунку: Мобільні застосунки.

Далі: Кінцева точка даних клієнтів · SPA та переходи між сторінками

Оновлено: