撤销 Keycloak 访问令牌

Posted

技术标签:

【中文标题】撤销 Keycloak 访问令牌【英文标题】:Revoke Keycloak access token 【发布时间】:2020-09-29 15:02:51 【问题描述】:

我正在使用 Keycloak 来保护我的 react 前端和 node.js 后端。这些客户端使用基于角色的授权进行保护。

我的前端应用程序在 Keycloak 中注册为公共客户端,后端注册为不记名客户端。当用户登录到前端时,我正在获取该特定用户的访问令牌,并且我正在使用该访问令牌来调用后端 api 层。

当用户从前端注销时,我使用 keycloak 对象注销方法从 Keycloak 清除该特定用户的前端客户端会话。这工作正常,用户正在注销并重定向到 Keycloak 登录页面。

但问题是我仍然可以使用该已注销用户的访问令牌来调用后端 api。即使用户退出,访问令牌仍然有效。

我尝试了这个端点来撤销用户访问令牌。但是没有用 /auth/admin/realms//用户/

有没有办法在 Keycloak 中撤销特定用户的访问令牌?

【问题讨论】:

【参考方案1】:

我认为您只能撤销会话但不能发布访问令牌。所以唯一的解决办法就是选择很短的访问令牌生命周期结合静默刷新,这样可用性还是不错的,会话撤销后的最大访问时间等于或小于令牌生命周期。

编辑:有一个official guide about how to handle compromised tokens。他们没有提到如何撤销个人访问令牌,因此没有记录的方法可以这样做。但是,您可以通过所描述的“not_before”方式撤销所有已发布的访问密钥。

【讨论】:

有什么相关的文档吗?我也怀疑这种行为,但无法找到明确的解释。 感谢您的评论。我添加了一个链接。由于本指南中没有记录,因此很可能没有办法这样做。 这是我对大多数访问令牌实现的问题,他们只是忽略了这个问题。我正在构建自己的实现,它会从缓存中检查已撤销的令牌,因此它既安全又超快。【参考方案2】:

您可以使用帖子调用以下端点来撤销访问令牌

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

【讨论】:

以上是关于撤销 Keycloak 访问令牌的主要内容,如果未能解决你的问题,请参考以下文章

Keycloak:使用 keycloak-admin 为用户生成访问令牌

除了 keycloak 令牌之外,我还需要其他任何东西来访问使用 keycloak 保护的服务吗?

Keycloak 访问令牌与 UserInfo 令牌?

KEYCLOAK:仅通过“用户名”获取访问令牌(无密码)

访问令牌后的Keycloak授权过程

如何使用公钥在本地验证 keycloak 访问令牌