OAuth2.0 в действии! Как сделать недействительным токен JWT при выходе из системы?
OAuth2.0 в действии! Как сделать недействительным токен JWT при выходе из системы?

решение

JWTОдним из самых больших преимуществ является то, что этолицо без гражданстваиз,Он содержит всю информацию, необходимую для аутентификации и аутентификации.,Нет необходимости делать это на стороне сервера.,Это снижает нагрузку на сервер.

Но лицо без гражданства引出из问题也是可想而知из,Он не может сделать недействительным JWT с истекшим сроком действия. Приведите пример сценария выхода из системы,就传统изcookie/sessionМеханизм аутентификации,Просто удалите сеанс, существующий на стороне сервера, и все будет в порядке.

Но что касается JWT, то его не существует на стороне сервера. Хорошо, позвольте мне удалить JWT, существующий на стороне клиента. Что ж, общество сложное, так что перестаньте обманывать себя. JWT, удаленный вами на клиенте, все равно может пройти аутентификацию на стороне сервера.

использоватьJWT要非常明确из一点:Единственный способ сделать JWT недействительным — дождаться истечения времени.

Но состояние JWT можно спасти с помощью внешней силы. В это время кто-то спросил: не пощечина ли это? Используйте JWT из-за его отсутствия состояния, но нужно ли вам сохранять его состояние в данный момент?

На самом деле это не так. Разве вас не заставляют идти на крайние меры? Как вы думаете, как сделать выход из системы недействительным без использования внешней силы для сохранения состояния JWT?

Есть два часто используемых решения,белый списокичерный списокСпособ。

1. Белый список

Логика белого списка очень проста: при прохождении аутентификации JWT сохраняется в redis, а когда пользователь выходит из системы, JWT удаляется из redis. Этот метод аналогичен методу cookie/сессии.

2. Черный список

Логика черного списка также очень проста: при выходе из системы переведите JWT в redis и установите время истечения срока действия JWT при запросе ресурсов, определите, находится ли JWT в redis, и запретите доступ, если он есть; существует.

Оба решения – белый список и черный список – относительно легко реализовать.,ночерный список оказывает гораздо меньшую нагрузку на сервер, чем белый список,В конце концов, выход из системы — это не обычная операция.

Реализация черного списка

Ниже используется черный список, чтобы показать, как реализовать недействительность выхода из системы JWT на уровне шлюза.

Что именно хранится в Redis?

Возможно ли сохранить токен JWT напрямую? Конечно, это возможно, но токен JWT очень длинный и требует большого объема памяти.

Любой, кто знаком с токенами JWT, знает это.,JWTВ токене есть одинjtiПоле,Можно сказать, что это поле является уникальным идентификатором токена JWT.,следующее:

Поэтому это может бытьjtiПоле存入redisсередина,как уникальный идентификатор токена,Это экономит много памяти?

Как этого добиться? Разделен на два этапа:

  1. Необходимо определить черный в глобальном фильтре слоя шлюза список Существует ли текущий JWT
  2. Выйтиинтерфейссередина将JWTизjtiПоле作为keyХранить вredisсередина,И настройте JWT Срок годности

1. Уровень шлюза анализирует jti и время истечения срока действия JWT и помещает их в заголовок запроса.

существоватьшлюзиз全局过滤器GlobalAuthenticationFilterсередина直接从令牌середина解析出jtiиСрок годности

Логика здесь разделена на следующие этапы:

  1. Анализ jti и срока действия токенов JWT годности
  2. Запросить, существует ли черный из Redis на основе jti списоксередина,Если он существует, перехватите его напрямую,В противном случае отпустите
  3. Разберу jti и Срок годичность инкапсулируется в JSON и передается последующим микросервисам.

Код ключа следующий:

2. Модификация фильтров для последующих микросервисов.

Помните последнюю статью:Практическая информация! Весна Cloud Gateway Интегрировать OAuth2.0 Реализуйте распределенную унифицированную аутентификацию и авторизацию!середина微服务из过滤器AuthenticationFilter??

AuthenticationFilterЭтот фильтр используется для расшифровкишлюз层传递изJSONданные,и инкапсулировать его в Request,Таким образом, желаемую информацию о пользователе можно получить в любой момент бизнес-метода.

Здесь я положилJWT相关из信息同时инкапсулированный в了Requestсередина,Класс сущностиJwtInformation,следующее:

LoginValунаследованныйJwtInformation,следующее:

в это времяAuthenticationFilterЭтот фильтр очень легко модифицировать.,Просто нужноjtiи Срок годностиинкапсулированный вLoginValсередина即可,Код ключа следующий:

Логика очень проста и отмечена на картинке выше.

3. Реализация интерфейса выхода из системы.

В предыдущей статье не был предоставлен интерфейс выхода из системы, поскольку JWT без сохранения состояния вообще не требует выхода из системы, просто подождите, пока истечет срок его действия.

Конечно, чтобы реализовать выход и вход в систему с помощью Redis, интерфейс выхода из системы незаменим.

Логика очень проста. Просто установите jti токена JWT для выхода непосредственно в Redis и установите время истечения срока действия JWT. Код выглядит следующим образом:

Хорошо, теперь функция выхода и входа в систему JWT реализована...

Исходный код загружен на GitHub, обратите внимание на Официальный аккаунт:Колонка технологий Code Ape,Ключевые слова ответа:9529 Возьми!

Изменения в трех задействованных модулях заключаются в следующем:

имя

Функция

oauth2-cloud-auth-server

Служба аутентификации и авторизации OAuth2.0

oauth2-cloud-gateway

Служба шлюза

oauth2-cloud-auth-common

Публичный модуль

Подвести итог

Идея очень проста. Поскольку JWT не имеет состояния, он может использовать Redis только для записи своего статуса, чтобы сделать его недействительным.

тест

Дело в основном завершено,Давайте пройдемся по процессу.,следующее:

1. Войдите в систему и подайте заявку на получение токена.

2. Доступ к интерфейсу с помощью токена

Выход из токена не выполнен, поэтому к нему можно получить обычный доступ следующим образом:

3. Вызовите интерфейс для выхода из системы и входа в систему.

Запрос следующий:

4. Получите доступ к интерфейсу с помощью токена выхода.

Поскольку токен был отменен, интерфейс не должен быть доступен, а возврат выглядит следующим образом:

Исходный код загружен на GitHub, обратите внимание на Официальный аккаунт:Колонка технологий Code Ape,Ключевые слова ответа:9529 Возьми!

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose