Я использую jwt-плагин и стратегию в hapijs. Я могу создать токен jwt во время входа в систему и аутентифицировать другой API, используя тот же токен с помощью стратегии "jwt". Я устанавливаю токен в 'request.state.USER_SESSION' как файл cookie, где USER_SESSION - это токен. Также я не сохраняю этот токен в базе данных. Но как я могу уничтожить токен jwt во время выхода из системы. Пожалуйста, предложите способ.
Как уничтожить токены JWT при выходе из системы?
Ответ 1
JWT хранится в браузере, поэтому удалите токен, удаляющий файл cookie с клиентской стороны
Если вам нужно также аннулировать токен со стороны сервера до истечения срока его действия, например, учетная запись удалена/заблокирована/приостановлена, изменен пароль, изменены права доступа, пользователь вышел из системы администратором, взгляните на Недействительные теги JSON Web для некоторых общих методов, таких как создание черного списка или вращающихся жетонов
Ответ 2
Вы не можете вручную истечь токен после того, как он был создан. Таким образом, вы не можете выйти из системы с помощью JWT на стороне сервера, как в случае с сеансами.
JWT не имеет состояния, что означает, что вы должны хранить все, что вам нужно, в полезной нагрузке и пропустить выполнение запросов к БД для каждого запроса. Но если вы планируете иметь строгую функциональность выхода из системы, которая не может ожидать автоматического истечения срока действия токена, даже если вы очистили токен со стороны клиента, вам может понадобиться пренебречь логикой без сохранения состояния и выполнить некоторые запросы. так что решение?
Установите разумное время истечения для токенов
Удалить сохраненный токен со стороны клиента при выходе из системы
Запрос выдан токен против черного списка на каждый авторизованный запрос
Черный список
"Черный список" всех токенов, которые больше не действительны и еще не истек. Вы можете использовать базу данных с опцией TTL для документов, для которой будет задано время, оставшееся до истечения срока действия токена.
Redis
Redis - хороший вариант для черного списка, который позволяет быстро получить доступ к списку в памяти. Затем в промежуточном программном обеспечении, которое запускается при каждом авторизованном запросе, вы должны проверить, есть ли предоставленный токен в черном списке. Если это так, вы должны выдать несанкционированную ошибку. А если это не так, отпустите его, и проверка JWT обработает его и определит, истек ли он или все еще активен.
Ответ 3
При выходе из клиентской части проще всего удалить токен из хранилища браузера.
Но что делать, если вы хотите уничтожить токен на сервере Node -
Проблема с пакетом JWT заключается в том, что он не предоставляет какого-либо метода или способа уничтожения токена.
Таким образом, чтобы уничтожить токен на стороне сервера, вы можете использовать пакет jwt-redis вместо JWT
Эта библиотека (jwt-redis) полностью повторяет всю функциональность библиотеки jsonwebtoken с одним важным дополнением. Jwt-redis позволяет хранить метку токена в redis для проверки действительности. Отсутствие метки токена в redis делает токен недействительным. Чтобы уничтожить токен в jwt-redis, существует метод уничтожения
это работает следующим образом:
1) Установите jwt-redis из npm
2) Создать -
var redis = require('redis');
var JWTR = require('jwt-redis').default;
var redisClient = redis.createClient();
var jwtr = new JWTR(redisClient);
jwtr.sign(payload, secret)
.then((token)=>{
// your code
})
.catch((error)=>{
// error handling
});
3) Для проверки -
jwtr.verify(token, secret);
4) Уничтожить -
jwtr.destroy(token)
Примечание: вы можете указать expiresIn при входе токена так же, как это предусмотрено в JWT.
Ответ 4
Создайте функцию выхода из системы в контроллере следующим образом:
public function logout() {
Auth::guard('api')->logout();
return response()->json([
'status' => 'success',
'message' => 'logout'
], 200);
}
Для более подробной информации: https://dev-yakuza.github.io/en/laravel/jwt-logout/