我想询问是否有办法通过单个http请求从keycloak
注销。
我已尝试发布/protocol/openid-connect/logout
或/tokens/logout
,但结果始终是ORIGIN问题。
但调用ORIGIN是在keycloak中配置的,并且带有请求的登录工作正常。
在没有重定向或打开另一个窗口的情况下有机会退出吗?
致以最诚挚的问候和感谢! :)
答案 0 :(得分:4)
您可以通过多种方式注销Web应用程序。对于Java EE servlet容器,你可以调用
HttpServletRequest.logout()
。对于其他浏览器应用程序,您可以将浏览器重定向到
http://auth-server/auth/realms/{realm-name}/protocol/openid-connect/logout?redirect_uri=encodedRedirectUri
,如果您与浏览器进行了SSO会话,则会将您注销。
要获取应用的确切网址(host,realm和redirect_uri配置):
答案 1 :(得分:1)
如果您不是创建自己的适配器,而是使用例如OpenID 认证的库,您可能希望使用该库注销,否则,如 ch271828n 所述,您可能会从 Keycloak 注销但保留会话和访问令牌...
就我而言,我使用的是 openresty 和 lua-resty-openidc
在我们访问 https://<keycloak-server>/auth/realms/<my-realm>/protocol/openid-connect/logout
处的 opts.logout_path 后,访问 keycloack 注销 url https://<our-nginx-server>/service/logout
(如@aName 的回答中详述)是由 lua 完成的
因此,在正确设置完所有内容后,我们要注销所要做的就是使用 https://<our-nginx-server>/service/logout
处的 OpenID 客户端的注销。这将破坏会话并使我们从客户端和 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";
}