Авторизация пользователей

Помимо каналов, где каждый, кто знает имя канала может подписаться на него, есть возможность авторизации пользователей на комет сервере и отправки личных сообщений пользователям по их идентификаторам. Авторизация пользователя происходит в 2 этапа. Первый этап это отправка идентификатора пользователя в вашей системе и случайного хеша в комет сервер.

mysql> INSERT INTO users_auth (id, hash )VALUES (1, 'auth_hash1');
  • Здесь строка auth_hash1 - это текстовый ключ авторизации. Вы его сами генерируете на своём сервере и отправляете сначала в комет по средствам insert запроса в таблицу users_auth, а затем передаёте в JavaScript для авторизации конкретного пользователя на комет сервере.
  • Числовой_Идентификатор_пользователя - Это id пользователя на вашем сайте, любое целое положительное число не более чем из 9 цифр.
// На втором этапе эти сведения (идентификатор пользователя и хеш) надо передать в JavaScript Api
$(document).ready(function()
{
    CometServer().start({dev_id:15, user_key:"auth_hash1", user_id:"Числовой_Идентификатор_пользователя" })
});

И теперь пользователь будет авторизован на комет сервере.

Для того чтоб отменить авторизацию можно вызвать удаление записи из users_auth

mysql> DELETE FROM users_auth WHERE id = 1;

Авторизация на основе JWT токенов

Авторизация с использованием JWT менее ресурсоёмкая и более простая чем обычный способ описанный выше. Вам не надо отправлять в таблицу users_auth запрос с ключём авторизации. Вы формируете токен и отдаёте его пользователю. А пользователь его отдаёт в комет сервер. Комет сервер в состоянии проверить валидный токен или нет. Таким образом мы экономим количество запросов между вашим приложением и комет сервером.

Для создания тестовых токенов удобно использовать jwt.io

Для формирования JWT токена надо взять в качестве секретной фразы ваш пароль для подключения к CometQL (dev_key) и добавить к нему в конц ваш dev_id. Используя полученую строку как секретную фразу формируем токен со следующим телом:

Пример создания токена jwt

В PAYLOAD передаём время жизни токена и идентификатор пользователя. На пример для подключения с параметрами тестового пользователя:

# Сервер app.comet-server.ru
# Логин 15 (dev_id)
# Пароль lPXBFPqNg3f661JcegBY0N0dPXqUBdHXqj2cHf04PZgLHxT6z55e20ozojvMRvB8 (dev_key)
# База данных CometQL_v1

# Строка для подключения из консоли mysql клиентом
mysql -h app.comet-server.ru -u15 -plPXBFPqNg3f661JcegBY0N0dPXqUBdHXqj2cHf04PZgLHxT6z55e20ozojvMRvB8 -DCometQL_v1  --skip-ssl

Секретный ключь для формирования токена будет

    dev_id + dev_key = lPXBFPqNg3f661JcegBY0N0dPXqUBdHXqj2cHf04PZgLHxT6z55e20ozojvMRvB815

Вот код на php для генерации токена

<?php
 
function getJWT($data, $pass, $dev_id = 0)
{
// Create token header as a JSON string
$header = json_encode(['typ' => 'JWT', 'alg' => 'HS256']);
 
if(isset($data['user_id']))
{
    $data['user_id'] = (int)$data['user_id'];
}
 
// Create token payload as a JSON string
$payload = json_encode($data);
 
// Encode Header to Base64Url String
$base64UrlHeader = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($header));
 
// Encode Payload to Base64Url String
$base64UrlPayload = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($payload));
 
// Create Signature Hash
$signature = hash_hmac('sha256', $base64UrlHeader . "." . $base64UrlPayload, $pass.$dev_id, true);
 
// Encode Signature to Base64Url String
$base64UrlSignature = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($signature));
 
// Create JWT
return trim($base64UrlHeader . "." . $base64UrlPayload . "." . $base64UrlSignature);
}
 
echo getJWT(['user_id' => 2, "exp" => 1683228800], 'lPXBFPqNg3f661JcegBY0N0dPXqUBdHXqj2cHf04PZgLHxT6z55e20ozojvMRvB8', '15');

Так как токен выдаётся на какое то время то для того чтоб прервать действие JWT токена досрочно можно его отозвать поместив его в список отозванных токенов запросом

INSERT INTO revoked_tokens(token)VALUES("revokedJWT");

Пример авторизации:

Отправка сообщений для авторизованных пользователей

При отправке сообщений авторизованным пользователям по их идентификатору (insert запрос в таблицу users_messages) сообщения доставляются пользователю на все устройства (До 16 устройств), на которых он прошёл авторизацию в данный момент. Это очень удобно в том случае, если человек зашёл на ваш сайт и авторизовался на нём более чем с одного устройства (к примеру телефон и компьютер или просто в двух разных браузерах сидит одновременно).

Если человек в данный момент offline, то сообщение помещается в очередь сообщений и будет доставлено когда человек появится online.

Основное назначение очереди сообщений это доставка сообщений после кратковременного перехода человека в ofline. Например, в тех случаях, когда человек обновляет страницу сайта на, которой было открыто соединение он уходит в ofline примерно на 1 секунду.

Подписка на получение личных сообщений

Для того, чтобы получать личные сообщения. Надо подписаться на них. Подписка на сообщения с именем события «event1» от сервера доставленные в соответствии с данными авторизации (то есть по id пользователя) осуществляется следующим образом.

CometServer().subscription("msg.event1", function(e){ console.log(e)})

Канал msg относиться к списку каналов с особыми свойствами

Определение статуса авторизации

Что бы определится авторизовались мы на комет сервере или нет есть несколько специальных функций

Функция isAuthorized вернёт текущее значение состояния авторизации. Бывает три значения в ответе.

  • undefined - статус ещё не определён, например, не было подключения или оно в процессе.
  • true - авторизованы
  • false - не авторизованны
cometApi.isAuthorized()

Функция onAuthSuccess служит для подписки на оповещения о том моменте, когда статус поменялся с любого на «авторизован»

cometApi.onAuthSuccess(function()
{
     alert("Авторизовались успешно")
})

Функция onAuthFalill служит для подписки на оповещения о том моменте, когда статус поменялся с любого на «не авторизован»

cometApi.onAuthFalill(function()
{
     alert("Не авторизовались")
})

Онлайн демо отправки личных сообщений

Код примера online demo on github Смотреть на codepen.io

Откройте пример в двух или более браузерах, Скопируйте ваш `USER_ID` из одного окна и вставьте его в другое окно. В поле с подписью ` Identificator of user who must will receive the message` введите текст сообщения и нажмите отправить. Вы увидите, что сообщение придёт только в то окно, у которого задан тот же USER_ID, который вы и указали при отправке.

See the Pen CppComet auth chat example by Trapenok Victor (@Levhav) on CodePen.

Обсуждение

Ваш комментарий. Вики-синтаксис разрешён:
I E C O H