Keycloak 注销不适用于公开 REST 服务的“仅承载”应用程序
Posted
技术标签:
【中文标题】Keycloak 注销不适用于公开 REST 服务的“仅承载”应用程序【英文标题】:Keycloak logout not working for "bearer-only" application exposing REST services 【发布时间】:2018-06-23 10:20:41 【问题描述】:我无法注销用户。注销适用于“机密”应用程序,但不适用于“仅承载”应用程序(注销后仍可访问 REST 服务)。
我有以下配置:
我在 Keycloak 中定义了一个“数据库”客户端应用程序,其访问类型为“仅承载”(创建的目的是根据用户角色公开受 Keycloak 保护的 REST Web 服务)
我在 keycloak 中定义了一个“rest_service”客户端应用程序,其访问类型为“机密”(创建的目的是让用户登录并在成功登录后允许访问“仅承载”REST 服务)。下面描述的工作流是在这个应用程序中使用 REST Web 服务实现的
我正在执行以下步骤:
在 URL http://localhost:8180/auth/realms/demo/protocol/openid-connect/auth 上执行 http GET 请求,将用户重定向到 Keycloak 处理的登录页面
用户使用他的凭据执行登录(使用 Keycloak 中定义的用户凭据)
Keycloak 将用户重定向到在步骤 1 中传递的“redirect_uri”。在此步骤中,Keycloak 还提供“状态”和“代码”值作为请求参数。
在用户被重定向回应用程序后,我将步骤 3 中收到的“代码”交换为在 http://localhost:8180/auth/realms/demo/protocol/openid-connect/token 上执行 POST 请求的令牌,这已成功完成
访问令牌可用后,我继续访问“仅承载”REST Web 服务。
注意:“仅承载”服务公开的 REST Web 服务不可访问,除非用户已登录并为其分配了正确的“角色”。
问题: 正如文章开头所述,用户在注销后仍然能够访问“仅承载”REST Web 服务。唯一可行的方法是从“机密”应用程序中注销(除非再次登录,否则用户无法访问该应用程序)。
如果我执行用户注销,那么仅承载应用程序公开的 REST Web 服务仍然可以访问。在 Keycloak 服务器中,我收到以下警告消息:“演示领域中的用户 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 请求在标头中传入 Authorization Bearer 以及 client_id、refresh_token、client_secret 和 redirect_uri
由“仅承载”服务公开的 REST 服务,它执行以下方法调用:HttpServletRequest request.logout()
以上方法均无效。
PS:我不想详细说明,因为即使这样,帖子也足够长了。如果我遗漏了什么,请告诉我,我会提供更多信息(如果可能的话,我也可以附上实际项目)
【问题讨论】:
同样的问题。运气好的话?我也试过 python-keycloak。相同的消息“某些客户端尚未为用户这已经很老了,但它可以帮助其他人。我不太记得我为解决此问题做了什么,但以下详细信息可能会有所帮助。
为了使令牌无效以使其无法再使用,您必须向以下端点执行 POST 请求: /auth/realms/REALM/users/USER_UUID/logout 并在标头中添加访问令牌。
PS: 如果有人尝试这样做并且对他有用,请添加评论,以便我可以确定这是一个可行的解决方案并帮助其他遇到此问题的人。 谢谢!
【讨论】:
以上是关于Keycloak 注销不适用于公开 REST 服务的“仅承载”应用程序的主要内容,如果未能解决你的问题,请参考以下文章