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

问题描述 投票:0回答:2

我无法注销用户。注销适用于“机密”应用程序,但不适用于“仅承载”应用程序(注销后仍然可以访问 REST 服务)。

我有以下配置:

  1. 我在 Keycloak 中定义了一个“数据库”客户端应用程序,其访问类型为“bearer-only”(创建目的是根据用户角色公开受 Keycloak 保护的 REST Web 服务)

  2. 我在 keycloak 中定义了一个“rest_service”客户端应用程序,其访问类型为“confidential”(创建目的是登录用户并允许在成功登录后访问“bearer-only”REST 服务)。下面描述的工作流是使用 REST Web 服务在此应用程序中实现的

我正在执行以下步骤:

  1. 在 URL http://localhost:8180/auth/realms/demo/protocol/openid-connect/auth 上执行 http GET 请求,将用户重定向到由 Keycloak 处理的登录页面

  2. 用户使用他的凭据执行登录(使用Keycloak中定义的用户的凭据)

  3. Keycloak 将用户重定向到步骤 1 中传递的“redirect_uri”。在此步骤中,Keycloak 还提供“state”和“code”值作为请求参数。

  4. 在用户被重定向回应用程序后,我将在第 3 步中收到的“代码”交换为在 http://localhost:8180/auth/realms/demo/protocol/openid-connect 上执行 POST 请求的令牌/token 成功完成

  5. 访问令牌可用后,我继续访问“仅承载”REST Web 服务。

注意:除非用户已登录并且分配了正确的“角色”,否则无法访问由“仅承载”服务公开的 REST Web 服务。

问题: 如帖子开头所述,用户在注销完成后仍然能够访问“仅承载”REST Web 服务。唯一似乎有效的是从“机密”应用程序注销(用户无法访问该应用程序,除非他再次登录)。

如果我执行用户注销,那么由 bearer-only 应用程序公开的 REST Web 服务仍然可以访问。在 Keycloak 服务器中,我收到以下 WARN 消息:“一些客户端尚未为演示领域中的用户 adminuser 注销:rest_service”

我尝试通过三种方式实现注销:

  1. 重定向到 URL http://localhost:8180/auth/realms/demo/protocol/openid-connect/logout 传递 redirect_uri 和 client_id 参数

  2. http://localhost:8180/auth/realms/demo/protocol/openid-connect/logout 的 POST 请求,在标头中传递授权承载以及 client_id、refresh_token、client_secret 和 redirect_uri

  3. “仅承载”服务公开的 REST 服务执行以下方法调用:HttpServletRequest request.logout()

以上方法都不行。

PS:我不想谈太多细节,因为即使这样帖子也足够长了。如果我遗漏了什么请告诉我,我会提供额外的信息(如果可能的话我也可以附上实际项目)

logout keycloak bearer-token
2个回答
0
投票

这已经很老了,但它可以帮助别人。我不太记得为了解决这个问题我做了什么,但下面的细节可能会有所帮助。

为了使令牌无效以使其不能再使用,您必须对以下端点执行 POST 请求: /auth/realms/{REALM}/users/{USER_UUID}/logout 并在标头中添加访问令牌。

附: 如果有人尝试这样做并且对他有用,请添加评论,以便我可以确定这是一个有效的解决方案并帮助其他人遇到这个问题。 谢谢!


0
投票

This thread is old but with the following change in Keycloak, the warning message

Some clients have been not been logged out for user {user} in {realm} realm: {client}
no longer appears:

在 {realm} > Clients > {client} 配置页面下 滚动到注销设置部分并关闭“前通道注销”

以下页面包含有关后台通道注销模式的更多信息 https://developers.redhat.com/articles/2022/12/07/how-implement-single-sign-out-keycloak-spring-boot

© www.soinside.com 2019 - 2024. All rights reserved.