Если посетители входят в аккаунт на вашем сайте, чат может входить вместе с ними. Тогда история переписки следует за аккаунтом: посетитель видит те же разговоры на телефоне, на ноутбуке и в любом другом браузере, где ваш сайт выполняет вход, а чаты, которые он вёл в этом браузере до входа, переносятся в аккаунт. Ваша команда видит, кто именно из ваших пользователей пишет.
Это единый вход (SSO) для веб-чата. Он использует тот же ключ и те же правила аккаунтов, что и единый вход вашего хелпдеска, поэтому пользователь, который входит и туда, и туда, для вашей команды остаётся одним контактом. Он доступен на платных тарифах.
Когда это нужно
- У ваших клиентов есть аккаунты на сайте (магазин, сервис, личный кабинет), и они возвращаются с разных браузеров и устройств.
- Команде нужно точно знать, кто пишет, а не полагаться на имя или email, которые кто-то ввёл сам.
Ничто, что приходит только из браузера посетителя, не может выполнить вход: ни email из формы перед чатом, ни значения из chatonio('set'), ни имя или email, переданные в chatonio('send'). Это может только пропуск, который ваш сервер подписал вашим ключом.
Как это работает
- Ваш сервер подписывает для вошедшего пользователя короткоживущий пропуск.
- Ваша страница передаёт чату функцию, которая получает этот пропуск.
- Чат отправляет пропуск в Chatonio, Chatonio его проверяет и выполняет вход в чат. Каждый пропуск срабатывает один раз.
Шаг 1: получите ключ
Откройте страницу канала веб-чата (Проекты → ваш проект → Каналы, затем ваш канал веб-чата). В карточке «Виджет веб-чата» раскройте раздел «Входить в чат под аккаунтом посетителя» и нажмите Сгенерировать ключ. Сразу скопируйте ключ — он показывается один раз — и храните его на сервере, а не в коде страниц.
Важно: это тот же ключ, что и у единого входа (SSO) вашего хелпдеска, и он один на проект. Если вы уже настроили SSO для хелпдеска, ключ уже есть (карточка показывает, что он задан): подписывайте им и пропуска для чата. Сменить ключ заменяет его сразу для обоих, поэтому, пока ваш сервер не начнёт подписывать новым ключом, перестанут работать и вход в чат, и единый вход в хелпдеск.
Шаг 2: подпишите пропуск на сервере
Пропуск — это JSON Web Token (JWT), подписанный алгоритмом HS256 вашим ключом. В нём такие поля:
sub— ID пользователя у вас, строкой. Обязательное поле: по нему Chatonio узнаёт пользователя.email— email пользователя. Обязательное поле.name— имя, которое увидит ваша команда.iatиexp— когда пропуск выдан и когда истекает, в секундах. Обязательные поля.exp— не позже чем через 5 минут послеiat.jti— значение, уникальное для каждого пропуска. Без него два пропуска для одного пользователя, выданные в одну и ту же секунду, совпадают, и второй отклоняется как уже использованный."email_verified": true— только если вы проверили, что адрес принадлежит пользователю. См. раздел «К какому аккаунту выполняется вход» ниже.
Отдавайте пропуск с адреса на вашем сайте, который отвечает только вошедшему пользователю, берёт пользователя из вашей собственной сессии (а не из запроса) и возвращает пропуск обычным текстом без кеширования. На Node.js с jsonwebtoken:
const jwt = require('jsonwebtoken');
const crypto = require('crypto');
app.get('/your-server/chat-pass', requireSignedIn, (req, res) => {
const pass = jwt.sign(
{ sub: String(req.user.id), email: req.user.email, name: req.user.name, jti: crypto.randomUUID() },
process.env.CHATONIO_SSO_SECRET,
{ algorithm: 'HS256', expiresIn: '5m' },
);
res.set('Cache-Control', 'no-store').type('text/plain').send(pass);
});
На Python с PyJWT:
import time, uuid, jwt
def chat_pass(user):
now = int(time.time())
return jwt.encode(
{'sub': str(user.id), 'email': user.email, 'name': user.name,
'iat': now, 'exp': now + 300, 'jti': uuid.uuid4().hex},
CHATONIO_SSO_SECRET, algorithm='HS256')
Шаг 3: выполните вход в чат на страницах
Для вошедших пользователей на вашем сайте добавьте рядом с кодом виджета:
<script>
window.chatonio = window.chatonio || function () { (window.chatonio.q = window.chatonio.q || []).push(arguments); };
chatonio('login', function () {
return fetch('/your-server/chat-pass').then(function (r) { return r.text(); });
});
</script>
Первая строка позволяет вызывать chatonio(...) ещё до загрузки виджета: вызов подождёт и выполнится, как только виджет будет готов. При загрузке страницы чат тоже несколько секунд ждёт входа, поэтому открывается уже под аккаунтом.
Передавайте в login функцию: чат вызывает её, когда ему нужен пропуск, — один раз при загрузке страницы, а затем примерно каждые 30 минут, пока страница открыта, — так долгий визит и остаётся во входе. Функция может вернуть пропуск или промис с ним. Страница, которую собирает сервер, может вместо этого сразу вставить свежий пропуск: chatonio('login', pass), но такой вход продлить нельзя, и он действует не больше часа.
Выход
Когда пользователь выходит из аккаунта на вашем сайте, вызовите:
chatonio('logout');
Вход в чат завершится, и дальше в этом браузере будет писать уже новый анонимный посетитель — следующий человек за этим компьютером не продолжит за предыдущим.
Что получают посетители
- Одна история на всех устройствах. Везде, где ваш сайт выполняет вход, чат показывает разговоры посетителя в этом чате.
- Прежние чаты сохраняются. При входе чаты, которые посетитель вёл в этом браузере в этом чате, переносятся в его аккаунт. Переносятся только сами разговоры: данные о себе, которые он указал до входа (поля контакта, например в форме перед чатом), остаются у анонимного посетителя.
- Только разговоры этого чата. Заявки аккаунта в хелпдеске и переписка по email в чате не появляются.
- Безопасно на общих компьютерах. Чат остаётся во входе, только пока страница его подтверждает. Загрузка страницы без пропуска открывает анонимный чат, поэтому следующий человек за общим компьютером не увидит чужих переписок. Без свежего пропуска вход действует не больше часа.
Что видит ваша команда
В информационной панели диалога у контакта посетителя, вошедшего в чат, появляется блок «Аккаунт» с email аккаунта и ID пользователя — это sub из вашего пропуска. Такой же блок есть у клиентов хелпдеска, а пользователь, который входит и в хелпдеск, и в чат, остаётся одним контактом: его заявки и чаты собраны вместе.
Если в пропуске есть "email_verified": true, указанный в нём email также записывается в поле Email контакта, но только пока это поле пустое: email, который там уже есть, никогда не заменяется. Посетителям, вошедшим в чат, форма перед чатом не показывается, поэтому письмо-напоминание для офлайн-посетителей, если оно включено для канала, приходит им на адрес из этого поля.
К какому аккаунту выполняется вход
Правила те же, что и у единого входа в хелпдеск:
- Посетителя узнают по ID пользователя в пропуске (
sub). Если у вас изменился его email, email аккаунта тоже обновляется, если только новый адрес не занят другим аккаунтом. - Если аккаунта с таким ID нет, а аккаунт с тем же email есть, пропуск отклоняется. Исключение — аккаунт, у которого ещё нет ID (клиент, которого пригласила ваша команда, или аккаунт, созданный до того, как вы начали пользоваться SSO): если в пропуске есть
"email_verified": true, аккаунт привязывается к пользователю. - Иначе для пользователя создаётся новый аккаунт хелпдеска — если только в хелпдеске не выбрано «Только по приглашению». Тогда войти могут только пользователи, у которых аккаунт уже есть.
Подробнее об этих правилах: Способы входа в хелпдеск.
Если вход в чат не срабатывает
Если пропуск отклонён, чат остаётся анонимным, а в консоли браузера появляется строка, которая начинается с [Chatonio] chat sign-in refused, и причина:
feature_not_available— ваш тариф не включает вход в чат: он доступен на платных тарифах.sign_in_not_configured— ключ ещё не сгенерирован.invalid_signature— пропуск подписан не текущим ключом, например после Сменить ключ.expired— срок действия пропуска истёк. Проверьте часы на сервере.malformed— нет обязательного поля,subне строка, пропуск живёт дольше 5 минут,iatбольше чем на 30 секунд в будущем или подпись не HS256.replay— пропуск уже использован. Каждый раз получайте новый пропуск, не кешируйте ответ и добавьте уникальныйjti.account_conflict— этот email уже есть у другого аккаунта (см. выше).not_invited— в хелпдеске выбрано «Только по приглашению», а у пользователя ещё нет аккаунта.account_disabled— аккаунт пользователя отключён.
Если ваша функция выбрасывает ошибку или возвращённый ею промис отклоняется, в консоли будет сообщение о том, что функция получения пропуска не сработала. В автоматизированных браузерах (Selenium, Playwright, Puppeteer и других, которые выставляют navigator.webdriver) вход в чат отключён, поэтому проверяйте его в обычном браузере.