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

时间:2018-01-14 16:54:37

标签: logout keycloak bearer-token

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

我有以下配置:

  1. 我在Keycloak中定义了一个“数据库”客户端应用程序,其访问类型为“仅限承载”(旨在根据用户角色公开受Keycloak保护的REST Web服务)

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

  3. 实现

    我正在执行以下步骤:

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

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

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

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

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

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

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

      如果我执行用户注销,则仍然可以访问仅承载应用程序公开的REST Web服务。在Keycloak服务器中,我收到以下WARN消息:“某些客户端尚未在demo realm中注销用户adminuser:rest_service”

      我尝试以三种方式实施注销:

      1. 重定向到网址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()

      4. 上述两种方法均无效。

        PS:我不想详细介绍很多细节,因为即使如此,帖子也足够长。如果我错过了什么请告诉我,我会提供额外的信息(如果可能的话,我也可以附上实际的项目)

1 个答案:

答案 0 :(得分:0)

这已经很老了,但它可以帮助其他人。我不太记得我做了什么来解决这个问题,但以下详细信息可能会有所帮助。

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

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