Склеивание пользователей

Зачем необходима склейка?

Если пользователь заходит с разных устройств, браузеров, мессенджеров или использует режим "инкогнито", наша система не знает, что это один и тот же пользователь. Но есть специальный механизм, благодаря которому система может соединить все сессии с разных устройств в одного пользователя и собрать информацию о нем в одну карточку.

Как работает склейка?

Объединение происходит на основе параметра User ID, который необходимо передать при регистрации/авторизации пользователя. Для записи User ID нужно вызвать на стороне браузера скрипт:

carrotquest.auth('5231', '49672bf861335d68040fedb25c90a580dd33c6748dc82d8fe76d508ebcef2b4b');

Первый аргумент — User ID.
Второй — хеш HMAC SHA 256. Текстом для хеширования является User ID, ключом - User Auth Key (его можно узнать в панели администратора, пункт "Настройки -> Разработчикам"). Хеш нужно передавать в UTF-8.

В качестве User ID можно посылать любую строку длиной не более 255 символов. То есть, можно использовать в качестве User ID не только ID пользователя из вашей системы, но и email или телефон. Главное, чтобы выполнялись два правила:

  • Выбранный User ID должен быть уникальным для каждого пользователя
  • User ID не может меняться в течение жизни пользователя. Например, если пользователь может изменить свой email, то email не может являться User ID

Важно! Если при отправке carrotquest.auth в консоль браузера выдается 403 ошибка, проверьте хеш на правильность генерации в этом онлайн-генераторе.

Важно! Важно понимать, что безопасность держится на секретности User Auth Key (система с разделяемым секретом), поэтому этот ключ ни в коем случае нельзя использовать на стороне браузера (JavaScript). Генерация хеша должна происходить только на стороне сервера.

Пример генерации хеша на языке PHP:

<?php
$userId = '...';
$hash = hash_hmac('sha256', $userId, 'userauth-secret-key');
echo "carrotquest.auth('$userId', '$hash');"
?>

Таким образом, ваш пользователь не видит секретный ключ, и ему будет присвоен User ID=2. Этот метод можно вызывать только один раз после авторизации (актуально для Single Page App), либо он может вызываться многократно (если вы вставляете код средствами backend на каждую страницу, когда пользователь авторизован, т.е., например, через PHP). Подробнее про метод auth можно почитать здесь.

Почему пользователи не склеиваются по email в автоматическом режиме?

Так как мы собираем email из любого поля, злоумышленник может ввести не свой email. Таким образом он легко выдаст себя за любого другого человека, сможет читать его сообщения и совершать события от его имени.

Для чего нужны эти сложности с HMAC?

Примерно по той же причине, что и выше, но давайте на примере. Например, вы пишите backend на PHP. Если бы вы просто писали carrotquest.auth (<?php echo $userID ?>), то в браузере это бы выглядело как-то так: carrotquest.auth(1234). Злоумышленник видит, что вы отправляете User ID=1234, он может открыть консоль и начинать перебирать варианты (набрав carrotquest.auth(1235), он выдаст себя за пользователя с User ID=1235). Так он легко выдает себя за любого другого человека, получает доступ к его сообщениям и может совершать события от его имени. Если добавляется хеш, то секретный ключ, с помощью которого вычислен хеш, знает только ваш backend (исходный код которого злоумышленнику неизвестен) и backend Carrot quest. При вызове метода auth, Carrot quest, зная User ID и секретный ключ, вычисляет хеш самостоятельно. Затем проверяет, совпадает ли этот вычисленный хеш с тем, что был прислан. Если не совпадает, то запрос отвергается и объединения не происходит.

Склейка пользователя со стороны сервера?

Склеить пользователя с помощью REST API пока не представляется возможным. Но мы постоянно работаем над улучшением нашего сервиса и в будущем такая возможность не исключается.