Keycloak Backchannel注销

Eri*_* B. 4 java-ee keycloak

我试图了解Web应用程序中反向通道注销的流程,但是我发现文档令人困惑。我有一个运行JBoss EAP的JEE应用程序,带有Java Servlet过滤适配器(出于某些技术原因,我不能使用EAP适配器)。该用于注销,文件说:

您可以通过多种方式注销Web应用程序。对于Java EE Servlet容器,可以调用HttpServletRequest.logout()。对于其他浏览器应用程序,您可以将浏览器重定向到 http:// auth-server / auth / realms / {realm-name} / protocol / openid-connect / logout?redirect_uri = encodedRedirectUri,如果您有SSO,它将注销您浏览器会话。

管理员URL配置的文档说:

例如,反向通道注销的工作方式是:1.用户从一个应用程序发送注销请求2.该应用程序将注销请求发送到Keycloak 3. Keycloak服务器使用户会话无效。4.然后,Keycloak服务器使用一个与会话5相关联的管理url。当应用程序收到注销请求时,它将使相应的HTTP会话无效。

因此,据我了解,

  1. 调用HttpServletRequest.logout()应该向Keycloak发送请求
  2. 一个GET to http://auth-server/auth/realms/{realm-name}/protocol/openid-connect/logout?redirect_uri=encodedRedirectUri应该以某种方式检测到clientId(从重定向URI?)并将请求发送到适当的反向通道

这两种选择似乎都不适合我。无论哪种情况,我都不会从Keycloak回调到adminUrl。此外,在调用Request.logout()之后,我在Keycloak管理员中仍然看到相同数量的活动会话。根据这篇SO帖子,它似乎可以工作,但是我不确定是否缺少配置或某种形式的东西。

我尝试使用access_token将GET发送到注销端点,但这也没有任何区别。

我对本文档有什么误解?我应该如何编码注销?

Sim*_*mon 5

普通注销和反向通道注销是完全不同的两件事。

普通注销的工作原理是重定向浏览器到你(2)中提到的URL。通过Keycloak中的浏览器会话可以识别用户,因此浏览器重定向至关重要(甚至不必提供redirect_uri)。

我们在Tomcat中通过在应用程序中调用以下代码来实现此目的,该代码自行触发重定向(当然使用keycloak.json作为配置):

Object keycloakAttr = request.getAttribute(KeycloakSecurityContext.class.getName());
if (keycloakAttr != null && keycloakAttr instanceof RefreshableKeycloakSecurityContext) 
{
  // code inspired by org.keycloak.adapters.tomcat.AbstractKeycloakAuthenticatorValve.logoutInternal
  RefreshableKeycloakSecurityContext ksc = (RefreshableKeycloakSecurityContext)keycloakAttr;
  KeycloakDeployment deployment = ksc.getDeployment();
  ksc.logout(deployment);

  // Since a CatalinaSessionTokenStore is used as token store in Tomcat
  // tokenStore.logout() is not be necessary (???)

  request.removeAttribute(KeycloakSecurityContext.class.getName());
  request.setUserPrincipal(null);
}
Run Code Online (Sandbox Code Playgroud)

仅当有多个依赖方(以OIDC的名义)或“客户”在使用Keycloak时,才可以使用反向通道注销。它确保没有同一域(对于同一用户)中的客户端的客户端会话“存活”注销。

完成上述注销后,Keycloak将检查是否存在与Keycloak会话关联的客户端会话,并将反向通道注销请求发送到相应的客户端(在同一领域!),因此此过程完全不涉及浏览器会话。

要进行此工作(对于正确安装了相应Keycloak适配器的Node.js和Tomcat),仅需要我们在Keycloak中正确配置客户端的管理URL。注意:默认为“ /”,但是对于Tomcat,必须包含webapp上下文,例如https://myapp.com/mywebapp/