Keycloak注销请求不会注销用户

Posted

技术标签:

【中文标题】Keycloak注销请求不会注销用户【英文标题】:Keycloak logout request does not log out user 【发布时间】:2017-07-06 20:08:23 【问题描述】:

我目前正在使用 keycloak 2.5.0 做一个小项目 我已经设置了用户登录,现在我正在尝试实现页面范围的 logout 按钮。

正如documentation 所述,简称为路由 http://my-auth-server/auth/realms/master/protocol/openid-connect/logout?redirect_uri=http://application-root.com/ 为了简单起见,我使用了一个锚标记来发出这个 GET 请求。

如果我查看 Firefox 开发人员工具的“网络”选项卡,一切似乎都运行良好。我正在返回重定向请求的 302 状态代码。之后,应用程序成功请求 http://application-root.com/,状态码为 200,并将我重定向到此页面。

但是当我想再次请求锁定的内容(由 keycloak 保护的内容)时,它仍然可以访问

但每当我在重定向后手动删除 JSESSIONIDKEYCLOAK_ADAPTER_STATE cookie 时,一切正常,并且我已正确注销。遗憾的是,我无法以编程方式删除这些 cookie,因为它们是 HttpOnly

这个请求的预期行为是什么?

我错过了什么吗?

有没有人经历过类似的事情?

感谢您的帮助

【问题讨论】:

我遇到了类似的问题,因为我没有将参数 refresh_tokenclient_id 作为数据传递给 que 注销请求。即使不是 OK,注销端点也总是返回 200 OK。你能试试看会发生什么吗?无论如何,我在这里缺少一些信息。你在使用 Spring 适配器吗?你的配置是什么? 这个有什么答案吗? @Ruben:根据docs,我看不出refresh_tokenclient_id 是有效的参数...您是否了解更多信息? @PeterV.Mørch 这是 3 年前的事了,很可能情况发生了变化,我的回答不再有意义。我指的是在 HTTP 正文请求中包含 refresh_token 和 client_id 以注销。此字段值在登录响应中提供。 【参考方案1】:

我使用 Keycloak 4.8.3 版本实现了注销。强制参数是 id token (id_token_hint)。可选参数是重定向 url (post_logout_redirect_uri)。 示例:

http://my-auth-server/auth/realms/master/protocol/openid-connect/logout?id_token_hint=eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJEY0gyNnl0OFV0OEJQTGxoR&post_logout_redirect_uri=http:%2F%2Fapplication-root.com%2F>

【讨论】:

这帮助我指明了正确的方向。值得一提的是,这是一个 GET 请求,可作为一种快速的反向通道注销策略。返回代码是干净的(200 OK),因此您可以依赖它来检查代码中的错误。 @BlakeNeal:你说“这帮助我指明了正确的方向”。你们中的任何人还记得那个正确的方向是什么吗?我尝试发送id_token_hintpost_logout_redirect_uri,结果相同。 @andrija: id_token_hint 看起来很短...它只是 id_token 的开头,您手动缩短了它,所以这里看起来不错,对吧?还是这是您发送的文字 GET? 是的,彼得。真实身份令牌更长。

以上是关于Keycloak注销请求不会注销用户的主要内容,如果未能解决你的问题,请参考以下文章

通过 Keycloak REST API 注销用户不起作用

Keycloak node.js 适配器不会在注销时使 connect.sid 会话 cookie 无效

在 React js 应用程序中使用 Keycloak 注销用户的问题

如何在基于 Keycloak/Spring 的应用程序中实现单点注销?

Keycloak 注销不适用于公开 REST 服务的“仅承载”应用程序

从 Keycloak 帐户页面注销时更改 redirect_uri