Отменить токен доступа 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