Чем мы можем помочь?

Кратко опишите вопрос; мы ответим по электронной почте.

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'
});

Принимаются только следующие поля; всё остальное отбрасывается:

Адрес, заголовок, источник перехода и параметры кампаний виджет и так фиксирует при каждом переходе. Контекст передаётся только с согласием (Интеграция конфиденциальности). Не записывайте в эти поля персональные данные; для этого есть identify.

Мобильные приложения

В приложении передавайте идентификационные данные через JavaScript после загрузки WebView, никогда через адрес. Здесь тоже хеш вычисляется на сервере, а не в приложении: Мобильные приложения.

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

Обновлено: