Как я могу синхронизировать черные списки JWT в микросервисах PHP без узких мест или SPOF?Php

Кемеровские программисты php общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как я могу синхронизировать черные списки JWT в микросервисах PHP без узких мест или SPOF?

Сообщение Anonymous »

Я работаю над проектом на основе микросервисов, где каждый сервис представляет собой отдельное приложение PHP. Все они полагаются на JWT для аутентификации и авторизации. Сложная часть заключается в отзыве токенов (или внесении их в черный список), поэтому, когда один сервис отзывает токен, все остальные немедленно признают его недействительным.
Сейчас каждый сервис ведет свой собственный черный список в локальная база данных. Это работает достаточно хорошо, пока одна служба не аннулирует токен, в то время как другие остаются в неведении в течение некоторого времени. Мы рассмотрели возможность использования общего кэша (например, 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Php»