Сейчас каждый сервис ведет свой собственный черный список в локальная база данных. Это работает достаточно хорошо, пока одна служба не аннулирует токен, в то время как другие остаются в неведении в течение некоторого времени. Мы рассмотрели возможность использования общего кэша (например, Redis) или центральной базы данных для черных списков, но нам хотелось бы избежать создания единой точки отказа или серьезного узкого места в случае выхода из строя этого общего компонента.
Другой вариант, который мы рассмотрели, — это публикация событий отзыва через брокер сообщений (например, RabbitMQ или Kafka), но это по-прежнему приводит к накладным расходам и зависит от того, надежно ли каждый сервис получает эти события, даже если он временно отключен. Мы также пробовали выпускать токены с коротким сроком действия, чтобы они быстро истекали сами по себе, но это не поможет, если вам нужно немедленно отозвать их из соображений безопасности.
Ниже приведен упрощенный код. фрагмент (с использованием библиотеки firebase/php-jwt), показывающий, как служба проверяет, занесен ли токен в черный список:
Код: Выделить всё
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
function isBlacklisted(string $jti): bool
{
// This function queries a local database
// that stores blacklisted jti values
return false; // Placeholder
}
$jwt = $_SERVER['HTTP_AUTHORIZATION'] ?? '';
$secretKey = 'MY_SECRET_KEY';
try {
// Decode and verify the signature
$decoded = JWT::decode($jwt, new Key($secretKey, 'HS256'));
// If the token has a jti (JWT ID), check if it's blacklisted
$jti = $decoded->jti ?? null;
if ($jti && isBlacklisted($jti)) {
throw new Exception('Token has been revoked');
}
// Token is valid and not blacklisted; proceed
echo "Token is valid!";
} catch (Exception $e) {
// Handle invalid or revoked token
echo "Invalid or revoked token!";
}
Спасибо!
Подробнее здесь: https://stackoverflow.com/questions/793 ... ck-or-spof