我无法注销用户。注销适用于“ secret ”应用程序,但不适用于“仅承载”应用程序(注销后仍然可以访问 REST 服务)。
我有以下配置:
我在 Keycloak 中定义了一个“数据库”客户端应用程序,其访问类型为“bearer-only”(创建目的是根据用户角色公开受 Keycloak 保护的 REST Web 服务)
我在 keycloak 中定义了一个“rest_service”客户端应用程序,其访问类型为“ secret ”(创建的目的是让用户登录并允许在成功登录后访问“bearer-only”REST 服务)。下面描述的工作流是使用 REST Web 服务在此应用程序中实现的
我正在执行以下步骤:
在 URL http://localhost:8180/auth/realms/demo/protocol/openid-connect/auth 上执行了一个 http GET 请求它将用户重定向到由 Keycloak 处理的登录页面
用户使用他的凭据(使用 Keycloak 中定义的用户的凭据)执行登录
Keycloak 将用户重定向到在步骤 1 中传递的“redirect_uri”。在此步骤中,Keycloak 还提供“state”和“code”值作为请求参数。
在用户被重定向回应用程序后,我将在步骤 3 中收到的“代码”交换为在 http://localhost:8180/auth/realms/demo/protocol/openid-connect/token 上执行 POST 请求的 token 。成功完成
访问 token 可用后,我继续访问“仅承载”REST Web 服务。
注意:除非用户已登录并且分配了正确的“角色”,否则无法访问由“仅承载”服务公开的 REST Web 服务。
问题: 如帖子开头所述,用户在注销完成后仍然能够访问“仅承载”REST Web 服务。唯一似乎有效的是从“ secret ”应用程序注销(用户无法访问该应用程序,除非他再次登录)。
如果我执行用户注销,那么由仅承载应用程序公开的 REST Web 服务仍然可以访问。在 Keycloak 服务器中,我收到以下 WARN 消息:“一些客户端尚未为演示领域中的用户 adminuser 注销:rest_service”
我尝试通过三种方式实现注销:
重定向到 URL http://localhost:8180/auth/realms/demo/protocol/openid-connect/logout传入redirect_uri和client_id参数
对 http://localhost:8180/auth/realms/demo/protocol/openid-connect/logout 的 POST 请求在 header 中传入 Authorization Bearer 和 client_id、refresh_token、client_secret 和 redirect_uri
由执行以下方法调用的“仅承载”服务公开的 REST 服务:HttpServletRequest request.logout()
以上方法均无效。
PS:我不想谈太多细节,因为即便如此,帖子也足够长了。如果我遗漏了什么请告诉我,我会提供额外的信息(如果可能我也可以附上实际项目)
最佳答案
这已经很老了,但它可以帮助其他人。我不太记得为了解决这个问题我做了什么,但以下详细信息可能会有所帮助。
为了使 token 无效以使其无法再使用,您必须向以下端点执行 POST 请求: /auth/realms/{REALM}/users/{USER_UUID}/logout 并在 header 中添加访问 token 。
附言: 如果有人尝试这样做并且对他有用,请添加评论,以便我可以确定这是一个有效的解决方案并帮助其他人遇到这个问题。 谢谢!
关于logout - Keycloak 注销不适用于暴露 REST 服务的 "bearer-only"应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48251928/