При попытке выйти из системы после обновления токена доступа я получаю сообщение об ошибке: 400 Bad request - invalid id_token_hint. Сервер авторизации использует JdbcOAuth2AuthorizationService. Поэтому я вижу, что токен клиента (oidc_id_token_value) обновляется вместе с токеном доступа, но клиент (spring-oauth2-client + шлюз) не обновляет этот токен. Подскажите пожалуйста, как обновить этот токен на клиенте или сделать так, чтобы сервер авторизации его не обновлял. И вообще, что это за токен oidc_id_token/id_token_hint, весной я не смог найти о нем информации. Буду благодарен за любую помощь и заранее спасибо!
При настройке выхода я использовал эту ссылку. Пока я вижу только одно решение — написать собственный репозиторий токенов, который не будет обновлять поле клиентского токена(oidc_id_token). Но я считаю, что это плохое решение. И я до сих пор не понимаю, как это происходит и почему, ведь срок действия еще не истек
ОБНОВЛЯТЬ:
Я нашел несколько похожих ссылок на мою проблему, но из них понял только то, что проблема не решена. Возможно, кому-то будет полезно:
что это за токен 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, которая отражает некоторые требования токена доступа — минимум имени пользователя, полномочий и срока действия токена доступа.Большое спасибо за ваш ответ. Это многое мне объяснило.
Хорошая работа по связыванию похожих вопросов. Если вы примете мой ответ, мы сможем пометить эти вопросы как повторяющиеся и направить сюда будущих читателей.