Keycloak退出请求

Sta*_*ack 7 java jboss keycloak

我想询问是否有办法keycloak通过单个http请求注销.

我已经尝试过POST /protocol/openid-connect/logout/tokens/logout,但结果始终是一个原点问题.

但调用ORIGIN是在keycloak中配置的,并且带有请求的登录有效.

有没有机会退出而不重定向或打开另一个窗口?

最好的问候和感谢!:)

aNa*_*ame 7

官方文档中

您可以通过多种方式注销Web应用程序。对于Java EE Servlet容器,可以调用HttpServletRequest.logout()

对于其他浏览器应用程序,可以将浏览器重定向到 http://auth-server/auth/realms/{realm-name}/protocol/openid-connect/logout?redirect_uri=encodedRedirectUri,如果与浏览器进行SSO会话,则注销。

要获取应用程序的确切URL(主机,领域和redirect_uri配置):

  • 登录到您的Keycloak用户帐户
  • 打开浏览器的开发者控制台
  • 执行注销操作
  • 记下用于请求注销的URL
  • 使用应用程序中的相同URL进行注销

  • 您好,我发现注销后,如果我“窃取”了访问令牌,我仍然可以使用它!这是期望的行为还是意外的行为?谢谢! (2认同)

ntg*_*ntg 6

如果您不创建自己的适配器,而是使用 OpenID 认证库,您可能希望使用该库注销,因为否则,正如 ch271828n 所描述的那样,您可能会从 Keycloak 注销,但保留会话和访问令牌...

就我而言,我使用的是 openresty 和lua-resty-openidc

在我们访问 opts.logout_path 后,访问 keycloack 注销 url https://<keycloak-server>/auth/realms/<my-realm>/protocol/openid-connect/logout(如 @aName 的答案中详述)是由 lua 完成的https://<our-nginx-server>/service/logout

因此,正确设置所有内容后,注销所需要做的就是使用 OpenID 客户端的注销,网址https://<our-nginx-server>/service/logout。这将破坏会话并使我们从客户端和 Keycloak 注销。

我认为我必须设置opts.revoke_tokens_on_logouttrue,另请注意,从我的实验来看,出于某种原因,设置redirect_after_logout_uri可能会导致用户由于重定向而无法注销。

这是我需要 nginx.conf 才能完成这项工作的示例......

location /myservice/ {

    access_by_lua_block {
        local opts = {
            redirect_uri_path = "/myservice/auth",
            discovery = "https://<keycloak-server>/auth/realms/<my-realm>/.well-known/openid-configuration",
            client_id = "<my-client-id>",
            client_secret = "<the-clients-secret>",
            logout_path = "/service/logout",
            revoke_tokens_on_logout = true,
            session_contents = {id_token=true} -- this is essential for safari!
        }
        -- call introspect for OAuth 2.0 Bearer Access Token validation
        local res, err = require("resty.openidc").authenticate(opts)

        if err then
            ngx.status = 403
            ngx.say(err)
            ngx.exit(ngx.HTTP_FORBIDDEN)
        end
    }

    # I disbled caching so the browser won't cache the site.
    expires           0;
    add_header        Cache-Control private;

    proxy_pass http://my-service-server.cloud:port/some/path/;
    proxy_set_header Host $http_host;

    proxy_http_version 1.1;
    proxy_redirect off;
    proxy_buffering off;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}
Run Code Online (Sandbox Code Playgroud)