Keycloak:登出后,仍然可以使用访问令牌

我有一个 nginx/openresty 客户端连接到 keycloak 服务器进行 openid 授权。 我使用 lua-resty-openidc 允许代理后面的服务访问。

用户可以在 https://<my-server>/auth/realms/<real-name>/account 访问他的个人资料,并可以通过 https://<my-server>/auth/realms/<real-name>/protocol/openid-connect/logout 来登出。

问题是,即使在登出后,用户仍然可以访问服务器后面的服务,似乎他从 keycloak 得到的访问令牌仍然有效或者什么的...... 这也是其他用户观察到的行为,例如 这个关于如何从 keycloak 登出的问题 中 ch271828n 的评论。

我该如何确保在登出后,用户将无法再次访问直到重新登录?

点赞
用户508907
用户508907

我需要检查[lua源代码](https://github.com/zmartzone/lua-resty-openidc/blob/master/lib/resty/openidc.lua),但是我认为我已经确定了登出行为:Lua-resty-openidc建立会话,当检测到特定的URL访问时终止会话(由“opts.logout_path”控制,我们需要将其设置为服务路径中的地址,例如... /service/logout)

本质上,有两个需要单击的URL,一个用于keycloack注销,另一个用于openresty会话注销。访问keycloack注销网址https://<keycloak-server>/auth/realms/<my-realm>/protocol/openid-connect/logout是由lua完成的,之后我们访问opts.logout_path在https://<our-nginx-server>/service/logout

因此,正确设置所有内容后,我们只需要单击“https:///service/logout”即可注销。这将销毁会话并使我们注销。

我认为我们需要将“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";
}
2021-04-22 13:02:33