JWTОдним из самых больших преимуществ является то, что этолицо без гражданстваиз,Он содержит всю информацию, необходимую для аутентификации и аутентификации.,Нет необходимости делать это на стороне сервера.,Это снижает нагрузку на сервер.
Но лицо без гражданства引出из问题也是可想而知из,Он не может сделать недействительным JWT с истекшим сроком действия. Приведите пример сценария выхода из системы,就传统изcookie/sessionМеханизм аутентификации,Просто удалите сеанс, существующий на стороне сервера, и все будет в порядке.
Но что касается JWT, то его не существует на стороне сервера. Хорошо, позвольте мне удалить JWT, существующий на стороне клиента. Что ж, общество сложное, так что перестаньте обманывать себя. JWT, удаленный вами на клиенте, все равно может пройти аутентификацию на стороне сервера.
использоватьJWT要非常明确из一点:Единственный способ сделать JWT недействительным — дождаться истечения времени.。
Но состояние JWT можно спасти с помощью внешней силы. В это время кто-то спросил: не пощечина ли это? Используйте JWT из-за его отсутствия состояния, но нужно ли вам сохранять его состояние в данный момент?
На самом деле это не так. Разве вас не заставляют идти на крайние меры? Как вы думаете, как сделать выход из системы недействительным без использования внешней силы для сохранения состояния JWT?
Есть два часто используемых решения,белый списокичерный списокСпособ。
Логика белого списка очень проста: при прохождении аутентификации JWT сохраняется в redis, а когда пользователь выходит из системы, JWT удаляется из redis. Этот метод аналогичен методу cookie/сессии.
Логика черного списка также очень проста: при выходе из системы переведите JWT в redis и установите время истечения срока действия JWT при запросе ресурсов, определите, находится ли JWT в redis, и запретите доступ, если он есть; существует.
Оба решения – белый список и черный список – относительно легко реализовать.,ночерный список оказывает гораздо меньшую нагрузку на сервер, чем белый список,В конце концов, выход из системы — это не обычная операция.
Ниже используется черный список, чтобы показать, как реализовать недействительность выхода из системы JWT на уровне шлюза.
Что именно хранится в Redis?
Возможно ли сохранить токен JWT напрямую? Конечно, это возможно, но токен JWT очень длинный и требует большого объема памяти.
Любой, кто знаком с токенами JWT, знает это.,JWTВ токене есть одинjtiПоле,Можно сказать, что это поле является уникальным идентификатором токена JWT.,следующее:
Поэтому это может бытьjtiПоле存入redisсередина,как уникальный идентификатор токена,Это экономит много памяти?
Как этого добиться? Разделен на два этапа:
существоватьшлюзиз全局过滤器GlobalAuthenticationFilterсередина直接从令牌середина解析出jtiиСрок годности。
Логика здесь разделена на следующие этапы:
Код ключа следующий:
Помните последнюю статью:Практическая информация! Весна Cloud Gateway Интегрировать OAuth2.0 Реализуйте распределенную унифицированную аутентификацию и авторизацию!середина微服务из过滤器AuthenticationFilter??
AuthenticationFilterЭтот фильтр используется для расшифровкишлюз层传递изJSONданные,и инкапсулировать его в Request,Таким образом, желаемую информацию о пользователе можно получить в любой момент бизнес-метода.
Здесь я положилJWT相关из信息同时инкапсулированный в了Requestсередина,Класс сущностиJwtInformation,следующее:
LoginValунаследованныйJwtInformation,следующее:
в это времяAuthenticationFilterЭтот фильтр очень легко модифицировать.,Просто нужноjtiи Срок годностиинкапсулированный вLoginValсередина即可,Код ключа следующий:
Логика очень проста и отмечена на картинке выше.
В предыдущей статье не был предоставлен интерфейс выхода из системы, поскольку 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 Возьми!