Клиент Spring OAuth2 выполняет выход из обратного канала с истекшим идентификатором токена

При попытке выйти из системы после обновления токена доступа я получаю сообщение об ошибке: 400 Bad request - invalid id_token_hint. Сервер авторизации использует JdbcOAuth2AuthorizationService. Поэтому я вижу, что токен клиента (oidc_id_token_value) обновляется вместе с токеном доступа, но клиент (spring-oauth2-client + шлюз) не обновляет этот токен. Подскажите пожалуйста, как обновить этот токен на клиенте или сделать так, чтобы сервер авторизации его не обновлял. И вообще, что это за токен oidc_id_token/id_token_hint, весной я не смог найти о нем информации. Буду благодарен за любую помощь и заранее спасибо!

При настройке выхода я использовал эту ссылку. Пока я вижу только одно решение — написать собственный репозиторий токенов, который не будет обновлять поле клиентского токена(oidc_id_token). Но я считаю, что это плохое решение. И я до сих пор не понимаю, как это происходит и почему, ведь срок действия еще не истек

ОБНОВЛЯТЬ:

Я нашел несколько похожих ссылок на мою проблему, но из них понял только то, что проблема не решена. Возможно, кому-то будет полезно:

  1. Проблема с сервером авторизации Spring и потоком обновления_токена Spring Cloud Gateway
  2. Выход из системы OIDC с сервера авторизации Spring не работает после обновления токена в облачном шлюзе Spring
  3. Выход из системы, инициированный OIDC RP, не работает после обновления первого токена доступа

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

ch4mp 22.08.2024 23:46
0
1
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

что это за токен oidc_id_token/id_token_hint

id_token_hint — это рекомендуемый параметр запроса на выход, отправляемого на сервер авторизации, как определено в спецификации выхода из системы, инициируемого RP.

напишите собственный репозиторий токенов, который не будет обновлять поле клиентского токена (oidc_id_token). Но я считаю, что это плохое решение.

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

Как и в случае со всеми JWT, срок действия токенов ID истекает, даже если их срок службы обычно больше, чем у токенов доступа. Поэтому, когда токены обновляются, все это должно быть обновлено (все, кроме токена обновления, если вы хотите принудительно выполнить новый вход после истечения срока действия исходного токена обновления). В спецификации выхода из системы, инициируемого RP, указано, что сервер авторизации ДОЛЖЕН принять просроченный id_token_hint, что означает, что рекомендуется это сделать, но у вас нет гарантии, что так и будет. Поэтому просто попросите клиента отправить действительный токен идентификатора (с требованием exp в будущем).

но клиент (spring-oauth2-client + шлюз) не обновляет этот токен

Бывает, иногда...

Токены обновляются при доступе с помощью (Reactive)OAuth2AuthorizedClientManager. К сожалению, OidcClientInitiated(Server)LogoutSuccessHandler внутренне использует (Reactive)ClientRegistrationRepository, который не обновляет токены с истекшим сроком действия. Я открыл заявку, чтобы исправить это, но приоритет еще не установлен. Я предполагаю, что с выпуском SpringOne на следующей неделе команда Spring Security спешит отшлифовать то, что было запланировано в следующем этапе и выпуске.

Хорошей новостью является то, что существует простой обходной путь при использовании Spring Cloud Gateway с фильтром TokenRelay, поскольку этот фильтр использует ReactiveOAuth2AuthorizedClientManager. Поэтому, если вы отправите фиктивный запрос, маршрутизируемый с помощью TokenRelay, непосредственно перед вызовом конечной точки выхода из системы, то токены будут обновлены, и выход из системы будет выполнен с действительным токеном идентификатора.

В моих приложениях:

  • бэкэнды предоставляют конечную точку /me, которая отражает некоторые требования токена доступа — минимум имени пользователя, полномочий и срока действия токена доступа.
  • Интерфейсные приложения планируют новый вызов к этой конечной точке незадолго до истечения срока действия токена доступа (в течение последней минуты). Этот:
    • принудительно обновляет токен. Я никогда не сталкивался с проблемой, о которой вы здесь сообщаете, потому что все токены обновляются до истечения срока их действия.
    • всегда предоставляет интерфейсу ту же информацию о доступе пользователя, что и ресурсный сервер (ресурсные серверы принимают решения по управлению доступом на основе токена доступа): если роли изменяются на сервере авторизации, это вступит в силу на ресурсном сервере( s) когда токен доступа обновляется
    • сохраняет сеанс клиента OAuth2 активным, так что сеанс пользователя контролируется только сеансом сервера авторизации.

Большое спасибо за ваш ответ. Это многое мне объяснило.

Elena 23.08.2024 09:48

Другие вопросы по теме