Различия
Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия Следующая версия Следующая версия справа и слева | ||
comet:authentication [2017/09/01 06:45] levhav |
comet:authentication [2018/07/19 17:33] levhav [Авторизация на основе JWT токенов] |
||
---|---|---|---|
Строка 4: | Строка 4: | ||
====== Авторизация пользователей ====== | ====== Авторизация пользователей ====== | ||
- | Помимо каналов где каждый кто знает имя канала может подписаться на него, есть возможность авторизации пользователей на комет сервере и отправки личных сообщений пользователям по их идентификаторам. Авторизация пользователя происходит в 2 этапа. Первый этап это отправка идентификатора пользователя в вашей системе и случайного хеша в комет сервер. | + | Помимо каналов, где каждый, кто знает имя канала может подписаться на него, есть возможность авторизации пользователей на комет сервере и отправки личных сообщений пользователям по их идентификаторам. Авторизация пользователя происходит в 2 этапа. Первый этап это отправка идентификатора пользователя в вашей системе и случайного хеша в комет сервер. |
<code sql> | <code sql> | ||
Строка 21: | Строка 21: | ||
И теперь пользователь будет авторизован на комет сервере. | И теперь пользователь будет авторизован на комет сервере. | ||
+ | Для того чтоб отменить авторизацию можно вызвать удаление записи из users_auth | ||
+ | <code sql> | ||
+ | mysql> DELETE FROM users_auth WHERE id = 1; | ||
+ | </code> | ||
+ | |||
+ | |||
+ | ====== Авторизация на основе JWT токенов ====== | ||
+ | |||
+ | Авторизация с использованием JWT менее ресурсоёмкая и более простая чем обычный способ описанный выше. Вам не надо отправлять в таблицу users_auth запрос с ключём авторизации. Вы формируете токен и отдаёте его пользователю. А пользователь его отдаёт в комет сервер. Комет сервер в состоянии проверить валидный токен или нет. Таким образом мы экономим количество запросов между вашим приложением и комет сервером. | ||
+ | |||
+ | Для создания тестовых токенов удобно использовать jwt.io | ||
+ | |||
+ | Для формирования JWT токена надо взять в качестве секретной фразы ваш пароль для подключения к CometQL (dev_key) и добавить к нему в конц ваш dev_id. Используя полученую строку как секретную фразу формируем токен со следующим телом: | ||
+ | |||
+ | {{ :comet:jwt-example.png|Пример создания токена jwt}} | ||
+ | |||
+ | В PAYLOAD передаём время жизни токена и идентификатор пользователя. | ||
+ | На пример для подключения с параметрами тестового пользователя: | ||
+ | |||
+ | <code> | ||
+ | # Сервер 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 | ||
+ | </code> | ||
+ | |||
+ | Секретный ключь для формирования токена будет | ||
+ | |||
+ | <code> | ||
+ | dev_id + dev_key = lPXBFPqNg3f661JcegBY0N0dPXqUBdHXqj2cHf04PZgLHxT6z55e20ozojvMRvB815 | ||
+ | </code> | ||
+ | |||
+ | Вот код на php для генерации токена | ||
+ | <file php> | ||
+ | <?php | ||
+ | |||
+ | function getJWT($data, $pass, $dev_id = 0) | ||
+ | { | ||
+ | // Create token header as a JSON string | ||
+ | $header = json_encode(['typ' => 'JWT', 'alg' => 'HS256']); | ||
+ | |||
+ | // 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'); | ||
+ | </file> | ||
+ | |||
+ | Так как токен выдаётся на какое то время то для того чтоб прервать действие JWT токена досрочно можно его отозвать поместив его в список отозванных токенов запросом | ||
+ | |||
+ | <code sql> | ||
+ | insert into revoked_tokens(token)VALUES("revokedJWT"); | ||
+ | </code> | ||
+ | |||
+ | Пример авторизации: | ||
+ | <html> | ||
+ | <iframe height='456' scrolling='no' title='CppComet JWT auth example' src='//codepen.io/Levhav/embed/xYwRJz/?height=265&theme-id=0&default-tab=js,result&embed-version=2' frameborder='no' allowtransparency='true' allowfullscreen='true' style='width: 100%;'>See the Pen <a href='https://codepen.io/Levhav/pen/xYwRJz/'>CppComet JWT auth example</a> by Trapenok Victor (<a href='https://codepen.io/Levhav'>@Levhav</a>) on <a href='https://codepen.io'>CodePen</a>. | ||
+ | </iframe> | ||
+ | </html> | ||
====== Отправка сообщений для авторизованных пользователей ====== | ====== Отправка сообщений для авторизованных пользователей ====== | ||
- | При отправке сообщений авторизованным пользователям по их идентификатору ([[comet:cometql#таблица_users_messages|insert запрос в таблицу users_messages]]) сообщения доставляются пользователю на все устройства (До 16 устройств) на которых он прошёл авторизацию в данный момент. Это очень удобно в том случаи если человек зашёл на ваш сайт и авторизовался на нём более чем с одного устройства (к примеру телефон и компьютер или просто в двух разных браузерах сидит одновременно). | + | При отправке сообщений авторизованным пользователям по их идентификатору ([[comet:cometql#таблица_users_messages|insert запрос в таблицу users_messages]]) сообщения доставляются пользователю на все устройства (До 16 устройств), на которых он прошёл авторизацию в данный момент. Это очень удобно в том случае, если человек зашёл на ваш сайт и авторизовался на нём более чем с одного устройства (к примеру телефон и компьютер или просто в двух разных браузерах сидит одновременно). |
- | Если человек в данный момент ofline то сообщение помещается в очередь сообщений и будет доставлено когда человек появится online. | + | Если человек в данный момент offline, то сообщение помещается в очередь сообщений и будет доставлено когда человек появится online. |
- | Основное назначение очереди сообщений это доставка сообщений после кратковременного перехода человека в ofline. Например в тех случаях когда человек обновляет страницу сайта на которой было открыто соединение он уходит в ofline примерно на 1 секунду. | + | Основное назначение очереди сообщений это доставка сообщений после кратковременного перехода человека в ofline. Например, в тех случаях, когда человек обновляет страницу сайта на, которой было открыто соединение он уходит в ofline примерно на 1 секунду. |
====== Подписка на получение личных сообщений ====== | ====== Подписка на получение личных сообщений ====== | ||
- | Для того чтобы получать личные сообщения. Надо подписаться на них. Подписка на сообщения с именем события "event1" от сервера доставленные в соответствии с данными авторизации (то есть по id пользователя) осуществляется следующим образом. | + | Для того, чтобы получать личные сообщения. Надо подписаться на них. Подписка на сообщения с именем события "event1" от сервера доставленные в соответствии с данными авторизации (то есть по id пользователя) осуществляется следующим образом. |
<code JavaScript>CometServer().subscription("msg.event1", function(e){ console.log(e)})</code> | <code JavaScript>CometServer().subscription("msg.event1", function(e){ console.log(e)})</code> | ||
Строка 43: | Строка 120: | ||
Функция isAuthorized вернёт текущее значение состояния авторизации. Бывает три значения в ответе. | Функция isAuthorized вернёт текущее значение состояния авторизации. Бывает три значения в ответе. | ||
- | * undefined - статус ещё не определён, на пример не было подключения или оно в процессе. | + | * undefined - статус ещё не определён, например, не было подключения или оно в процессе. |
* true - авторизованы | * true - авторизованы | ||
* false - не авторизованны | * false - не авторизованны | ||
Строка 51: | Строка 128: | ||
</code> | </code> | ||
- | Функция onAuthSuccess служит для подписки на оповещения о том моменте кода статус поменялся с любого на "авторизован" | + | Функция onAuthSuccess служит для подписки на оповещения о том моменте, когда статус поменялся с любого на "авторизован" |
<code JavaScript> | <code JavaScript> | ||
cometApi.onAuthSuccess(function() | cometApi.onAuthSuccess(function() | ||
Строка 59: | Строка 136: | ||
</code> | </code> | ||
- | Функция onAuthFalill служит для подписки на оповещения о том моменте кода статус поменялся с любого на "не авторизован" | + | Функция onAuthFalill служит для подписки на оповещения о том моменте, когда статус поменялся с любого на "не авторизован" |
<code JavaScript> | <code JavaScript> | ||
cometApi.onAuthFalill(function() | cometApi.onAuthFalill(function() | ||
Строка 71: | Строка 148: | ||
[[https://github.com/CppComet/auth-example|Код примера]] [[https://cppcomet.github.io/auth-example/index.html|online demo on github]] [[https://codepen.io/Levhav/pen/XaWLra|Смотреть на codepen.io]] | [[https://github.com/CppComet/auth-example|Код примера]] [[https://cppcomet.github.io/auth-example/index.html|online demo on github]] [[https://codepen.io/Levhav/pen/XaWLra|Смотреть на codepen.io]] | ||
- | Откройте пример в двух или более браузерах, Скопируйте ваш `USER_ID` из одного окна и вставьте его в другое окно. В поле с подписью ` Identificator of user who must will receive the message` введите текст сообщения и нажмите отправить. Вы увидите что сообщение придёт только в то окно у которого задан то же USER_ID который вы и указали при отправке. | + | Откройте пример в двух или более браузерах, Скопируйте ваш `USER_ID` из одного окна и вставьте его в другое окно. В поле с подписью ` Identificator of user who must will receive the message` введите текст сообщения и нажмите отправить. Вы увидите, что сообщение придёт только в то окно, у которого задан тот же USER_ID, который вы и указали при отправке. |
<html> | <html> | ||
- | <iframe height='800' scrolling='no' title='CppComet auth chat example' src='//codepen.io/Levhav/embed/XaWLra/?height=265&theme-id=dark&default-tab=js,result&embed-version=2' frameborder='no' allowtransparency='true' allowfullscreen='true' style='width: 100%;'>See the Pen <a href='https://codepen.io/Levhav/pen/XaWLra/'>CppComet auth chat example</a> by Trapenok Victor (<a href='https://codepen.io/Levhav'>@Levhav</a>) on <a href='https://codepen.io'>CodePen</a>. | + | <p data-height="900" data-theme-id="0" data-slug-hash="XaWLra" data-default-tab="js,result" data-user="Levhav" data-embed-version="2" data-pen-title="CppComet auth chat example" class="codepen">See the Pen <a href="https://codepen.io/Levhav/pen/XaWLra/">CppComet auth chat example</a> by Trapenok Victor (<a href="https://codepen.io/Levhav">@Levhav</a>) on <a href="https://codepen.io">CodePen</a>.</p> |
- | </iframe> | + | <script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script> |
</html> | </html> | ||