Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
comet:authentication [2018/02/24 12:07]
anastation468 [Отправка сообщений для авторизованных пользователей]
comet:authentication [2018/08/04 08:38]
levhav [Авторизация на основе JWT токенов]
Строка 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'​]);​
 +
 +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'​);​
 +</​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>​
 ====== Отправка сообщений для авторизованных пользователей ====== ====== Отправка сообщений для авторизованных пользователей ======
  
Строка 32: Строка 114:
  
 ====== Подписка на получение личных сообщений ====== ====== Подписка на получение личных сообщений ======
-Для того чтобы получать личные сообщения. Надо подписаться на них. Подписка на сообщения с именем события "​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: Строка 125:
 Функция isAuthorized вернёт текущее значение состояния авторизации. Бывает три значения в ответе. Функция isAuthorized вернёт текущее значение состояния авторизации. Бывает три значения в ответе.
  
-  * undefined - статус ещё не определён,​ на пример не было подключения или оно в процессе.+  * undefined - статус ещё не определён,​ напримерне было подключения или оно в процессе.
   * true - авторизованы   * true - авторизованы
   * false - не авторизованны   * false - не авторизованны
Строка 51: Строка 133:
 </​code>​ </​code>​
  
-Функция onAuthSuccess служит для подписки на оповещения о том моменте кода статус поменялся с любого на "​авторизован"​+Функция onAuthSuccess служит для подписки на оповещения о том моментекогда статус поменялся с любого на "​авторизован"​
 <code JavaScript>​ <code JavaScript>​
 cometApi.onAuthSuccess(function() cometApi.onAuthSuccess(function()
Строка 59: Строка 141:
 </​code>​ </​code>​
  
-Функция onAuthFalill служит для подписки на оповещения о том моменте кода статус поменялся с любого на "не авторизован"​+Функция onAuthFalill служит для подписки на оповещения о том моментекогда статус поменялся с любого на "не авторизован"​
 <code JavaScript>​ <code JavaScript>​
 cometApi.onAuthFalill(function() cometApi.onAuthFalill(function()
Строка 71: Строка 153:
 [[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>​