jboss Keycloak注销请求

eoigrqb6  于 2022-11-08  发布在  其他
关注(0)|答案(2)|浏览(194)

我想问一下是否有一种方法可以通过一个http请求从keycloak注销。
我已经尝试过发布/protocol/openid-connect/logout/tokens/logout,但结果总是一个起源问题。
但是调用的ORIGIN在keycloak中配置,并且使用请求进行登录。
这里有没有机会注销而不重定向或打开另一个窗口?
最诚挚的问候和感谢!:)

xqkwcwgp

xqkwcwgp1#

摘自官方文件:

您可以使用多种方式登出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执行注销
bis0qfac

bis0qfac2#

如果您没有创建自己的适配器,而是使用OpenID认证的库,您可能希望使用该库注销,因为否则,如ch 271828 n所述,您可能会从Keycloak注销,但会保留会话和访问令牌...
在我的例子中,我使用的是openresty和lua-resty-openidc
访问keycloack注销url https://<keycloak-server>/auth/realms/<my-realm>/protocol/openid-connect/logout(如@aName的答案中所详细描述的)是在我们访问https://<our-nginx-server>/service/logout处的opts.logout_path之后由lua完成的
因此,在正确设置所有内容后,我们要做的就是注销我们的OpenID客户端https://<our-nginx-server>/service/logout)。这将破坏会话,并从客户端和Keycloak注销我们。
我想我必须将opts.revoke_tokens_on_logout设置为true,另外请注意,根据我的实验,由于某种原因,设置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";
}

相关问题