Как правильно организовать работу с парой токенов JWT + Refresh?
Суть: нужно добиться эффекта, что если пользователь пользуется системой, токены обновляются и все хорошо. Если пользователь отошел на час (время жизни access token), при дальнейшем действии его нужно разлогинивать из системы.
На текущий момент бэкенд полностью реализован, выдача токена, обновление, отзыв токена и тд. остаются следующие вопросы:
1) Кто следит за токеном и обновляет пару? Бэкенд или Фронтенд?
2) Я предполагал что фронтенд перед каждым запросом будет проверять не истек ли срок жизни access token, и если истек - отправляет запрос на обновление токенов, получает их, приклеивает и дальше проходит запрос. Но как в таком случае, разлогинивать пользователя при отсутствии активности в течении 1 часа?
Дополнительно:
Содержание
Я предполагал что фронтенд перед каждым запросом будет проверять не истек ли срок жизни access token, и если истек - отправляет запрос на обновление токенов, получает их, приклеивает и дальше проходит запрос. Но как в таком случае, разлогинивать пользователя при отсутствии активности в течении 1 часа?
Его не нужно разлогинивать, т.к. проверка токена не пройдет. В общем это будет примерно так выглядеть
1) фронт видит, что access токен истёк
2) Отправляет refresh на точку api
3) refresh api видит что refresh токен истёк и отправляет статус 401 например и фронт переводит пользователя на панель логина
4) пользователь вводит учётные данные снова
Время жизни access token ставите допустим 5 минут. Время жизни рефреша 1 час. Профит
Ответы:
Следить за сроком жизни может как клиент, так и сервер или оба.
В первом случае клиент, обнаружив просроченный токен доступа, сразу отправляет запрос на обновление. Недостаток - если на клиенте перевести часы назад, то он не обнаружит протухший токен.
Во втором случае время всегда берётся с одного источника (сервера), но будет лишний запрос, на который сервер ответит, что токен просрочен.
Для решения данной проблемы вы можете воспользоваться услугами фрилансеров. Мы выполним необходимую работу быстро и качественно.
Оставить комментарий Отменить
Ответы
- Есть ответ! к записи Как уменьшить масштаб меньше 100% в Windows 10 (22H2)
- Есть ответ! к записи Аналоги CloudFlare в России?
- Есть ответ! к записи Аналоги CloudFlare в России?
- Есть ответ! к записи Как называется человек, который дизайн придумает для сайта и сверстает его?
- Есть ответ! к записи Можно ли установить Яндекс.Диск на АльтЛинукс?
- Есть ответ! к записи Картинки мутные только на сафари, есть выход?
- Есть ответ! к записи Keenetic. Как настроить SSTP клиент с сертификатом?
- Есть ответ! к записи Чем заменить executor в aiogram 3?
Для корректного использования пары JWT и Refresh токенов в приложении необходимо следовать определенным шагам.
1. Генерация JWT токена:
JWT токен создается при успешной аутентификации пользователя и содержит информацию о пользователе и его правах. Для генерации токена можно использовать библиотеки, такие как `firebase/php-jwt` или `lcobucci/jwt`.
```php
123,
"username" => "john_doe"
);
$jwt = JWT::encode($payload, $secret_key);
```
2. Отправка JWT токена клиенту:
После генерации токена, он должен быть отправлен клиенту для сохранения. Обычно это делается путем добавления токена в заголовок `Authorization` или в тело ответа.
```php
<?php
header('Authorization: Bearer ' . $jwt);
```
3. Проверка и обновление токена:
При каждом запросе клиента необходимо проверять валидность JWT токена. Если токен истек или невалиден, то клиент должен использовать Refresh токен для получения нового JWT токена.
```php
exp < time()) {
// Generate new JWT token using Refresh token
// Respond with new JWT token
}
```
4. Хранение Refresh токена:
Refresh токен должен быть хранен в безопасном месте на сервере. Обычно он сохраняется в базе данных с привязкой к пользователю.
```php
<?php
// Save Refresh token in database
$refresh_token = generate_refresh_token();
save_refresh_token($user_id, $refresh_token);
```
5. Обновление JWT токена:
При использовании Refresh токена, необходимо генерировать новый JWT токен для клиента.
```php
<?php
$payload['user_id'] = $user_id;
$new_jwt = JWT::encode($payload, $secret_key);
```
Следуя этим шагам, вы сможете корректно использовать пару JWT и Refresh токенов в вашем приложении.