Отменить токен доступа Keycloak

Я использую Keycloak для защиты своего интерфейса реагирования и серверной части node.js. Эти клиенты защищены с помощью авторизации на основе ролей.

Мое внешнее приложение зарегистрировано в Keycloak как общедоступный клиент, а внутреннее - как клиент-носитель. Когда пользователь входит в интерфейс, я беру токен доступа для этого конкретного пользователя и использую этот токен доступа для вызова внутреннего уровня API.

Когда пользователь выходит из внешнего интерфейса, я очищаю сеанс внешнего клиента этого конкретного пользователя от Keycloak, используя метод выхода объекта keycloak. Это работает нормально, и пользователь выходит из системы и перенаправляется на страницу входа в Keycloak.

Но проблема в том, что я все еще могу использовать токен доступа этого вышедшего из системы пользователя для вызова внутреннего API. Маркер доступа остается действительным, даже если пользователь вышел из системы.

Я попробовал эту конечную точку, чтобы отозвать токен доступа пользователя. Но не сработало /auth/admin/realms//users/

Есть ли способ отозвать токен доступа конкретного пользователя в Keycloak?

3 ответа

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

РЕДАКТИРОВАТЬ: есть официальное руководство о том, как обращаться с скомпрометированными токенами. В них не упоминается, как отозвать отдельный токен доступа, поэтому нет задокументированного способа сделать это. Однако вы можете отозвать все выданные ключи доступа описанным способом "not_before".

Можно хоть на КС 17.0 через /protocol/openid-connect/revokeно так как это конечная точка аутентификации, вы должны указать и , и , потому что сервер должен проверить, принадлежит ли токен тому конкретному клиенту, который звонит.

Это означает, что наряду с , вам также может потребоваться отправить или что-то другое, принятое для аутентификации клиентского приложения на сервер - так же, как это было сделано ранее при получении токена на /protocol/openid-connect/token.

Также стоит отметить, что это должно быть передано как параметр формы POST или параметр запроса GET с этим именем: token, а не как заголовок носителя/и т.д.

КСТАТИ. Жетоны обновления могут быть отозваны тем же /openid-connect/revokeконечная точка так же, как токены доступа , при этом более старые легче найти /openid-connect/logoutпо-прежнему обрабатывает только токены идентификатора и токены обновления (POST a client_id, client_secretи т. д., а также либо refresh_tokenили же id_token_hintбыть убитым) и по-прежнему отклоняет любые попытки с токеном доступа. По крайней мере на КС 17.0

КСТАТИ. Я понятия не имею, может ли /revoke обрабатывать токены id. Я сомневаюсь в этом, но RFC, похоже, разрешают это как пользовательское расширение. Я не пробовал с KeyCloak 17.0

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

{serverName}/auth/realms/{realmName}/protocol/openid-connect/revoke

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