Clo*_*oud 2 java logout embedded-jetty keycloak
我在使用 Spring Framework 和 Jetty 8.1 的 Java 应用程序中使用 Keycloak 3.4 和 Keycloak Jetty-81-Adapter 3.4。
根据 Keycloak 文档,我应该能够在 Java EE 应用程序中使用 HttpServletRequest 从 Keycloak 注销。但是,这在我的情况下不起作用,即使 Jetty 支持 HttpServletRequests。
您可以通过多种方式注销 Web 应用程序。对于 Java EE servlet 容器,您可以调用 HttpServletRequest.logout()..
如果我尝试以这种方式注销,我会被重定向到 keycloak(登录屏幕,可选择从多个领域登录中进行选择)。然而,当我选择我的首选领域时,我会立即再次登录到 Web 应用程序,而无需提供任何凭据。
我尝试了另一种方法,通过重定向到 Keycloak:
对于其他浏览器应用,可以将浏览器重定向到
http://auth-server/auth/realms/ {realm-name}/protocol/openid-connect/logout?redirect_uri=encodedRedirectUri
但它会在 Keycloak 日志中引发连接拒绝错误,因为 Keycloak 尝试以直接方式调用我的 web 应用程序。它对保持活动状态的 Keycloak 会话没有影响。我强烈希望不需要从 Keycloak 直接到 webapp 的服务器端调用。
HttpServletRequest.logout()在我的情况下,为什么不破坏 keycloak 会话的任何建议?HttpServletRequest 的 Jetty 实现是否与 Java EE 实现如此不同以至于它根本无法工作?
我在使用远程 (OIDC) 身份提供商时也有类似的经历。我发现HttpServletRequest.logout实际上确实破坏了 中的会话Keycloak,但没有传播到我的远程身份提供者的注销 url。当转到远程登录站点时,它立即将我重定向回,看到我有一个活动会话。这看起来很像 keycloak 会话实际上并没有失效,但我检查了它。使用浏览器重定向到 url 在两个地方都注销了。可能是Keycloak.
难道你面临同样的问题?要验证,请尝试注销,然后在 keycloak 中选择您的客户端并列出会话,以查看它是否仍然存在于 Keycloak 中。
小智 5
如果方法(注销)是从不受保护的页面(不检查有效令牌的页面)执行的,则刷新令牌可能不可用,在这种情况下,适配器会跳过该调用。因此,建议使用受保护的页面来执行 HttpServletRequest.logout(),以便始终考虑当前令牌,并在需要时执行与 Keycloak 服务器的交互。 https://www.keycloak.org/docs/latest/secure_apps/index.html#logout
这在受保护的页面中对我有用,但在不受保护的页面中不起作用
public ExternalContext currentExternalContext() {
if (FacesContext.getCurrentInstance() == null) {
throw new RuntimeException("message here ");
} else {
return FacesContext.getCurrentInstance().getExternalContext();
}
}
public void logout() throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) currentExternalContext().getRequest();
ExternalContext externalContext = currentExternalContext();
request.logout();
externalContext.redirect(externalContext.getRequestContextPath());
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18771 次 |
| 最近记录: |