Подтверждение ключей подписью
Если по ключу показывается что-то важное — скидка, статус «оплачено», доступ к истории заказов, — ключ нужно подтвердить подписью вашего сервера. Тогда чат отличает «страница сказала, что это клиент 98765» от «сервер сайта подтвердил, что это клиент 98765».
Как это работает #
- Ваш сервер (там, где посетитель уже авторизован) выпускает короткоживущий токен — JWT
HS256на секрете подписи личности из панели. - Страница передаёт его вместе с ключами.
- Подтверждёнными считаются ключи, которые есть и в вызове, и в токене. Остальные приходят как обычные, неподтверждённые.
DirectDialog.push(['identify', {
keys: ['user:98765'],
token: '<выпущенный вашим сервером JWT>'
}]);
Полезная нагрузка токена #
{
"site": "shop.ru", // код сайта в «Прямом Диалоге»
"keys": ["user:98765"], // какие ключи подтверждаем
"iat": 1789401600, // необязательно, не из будущего
"exp": 1789405200 // обязательно, не дальше 24 часов
}
- Алгоритм — только
HS256;alg: noneи подмена алгоритма отвергаются до сравнения подписи. expобязателен, срок жизни — не больше суток (допуск на расхождение часов — минута). Выпускайте токен на час-другой и обновляйте при загрузке страницы.siteдолжен совпадать с кодом сайта — токен одного сайта не подойдёт другому.- Токен до 16 КБ; в нём только ключи, никаких персональных данных — он лежит в HTML страницы.
Пример выпуска на PHP:
function ddIdentityToken(array $keys, string $site, string $secret, int $ttl = 3600): string
{
$head = rtrim(strtr(base64_encode('{"alg":"HS256","typ":"JWT"}'), '+/', '-_'), '=');
$body = rtrim(strtr(base64_encode(json_encode([
'site' => $site,
'keys' => array_values($keys),
'iat' => time(),
'exp' => time() + $ttl,
])), '+/', '-_'), '=');
$sig = rtrim(strtr(base64_encode(hash_hmac('sha256', "$head.$body", $secret, true)), '+/', '-_'), '=');
return "$head.$body.$sig";
}
Галочка «Доверять только подтверждённым ключам» в настройках сайта делает подпись обязательной: неподтверждённые ключи перестают учитываться — ни склейки устройств, ни меток по ним не будет. Включайте её, когда фронтенд уже научился передавать токен, иначе узнавание посетителей просто выключится.