amd*_*dev 5 java xwiki single-sign-on keycloak
我们使用 Keycloak 作为 SSO 提供商来登录我们所有的应用程序。
我们使用 keycloak 注销端点在领域级别注销并使用户的访问令牌无效。
我们的问题是,如果用户已连接websiteA并websiteB从 注销,他仍然可以通过浏览器websiteA进行活动的本地会话。websiteB
基本上我们希望用户注销websiteB,有点像如果您从 google 驱动器注销,那么一旦您打开 gmail.com,您也会从 gmail 注销
希望对我们来说,keycloak 支持OIDC 反向通道注销
因此,我们定义当用户从 keycloak 注销时,LogoutToken 会发送到我们选择的端点上的每个应用程序
比方说websiteB/backchannel-logout
因此,在我的 JEE 应用程序中,服务器会在 url 上收到 LogoutToken/backchannel-logout
这是注销令牌的样子,仅供参考
{
"iat": 1654177246,
"jti": "66265511-a5fc-4f60-b5b7-65bea0e1a9e2",
"iss": "https://mykeycloakserver.com/auth/realms/myRealm",
"aud": "websiteB",
"sub": "18e56c69-a90d-4f32-b76a-c9166def54d0",
"typ": "Logout",
"sid": "5bca2f13-f7a6-4b41-bdfc-1f7a89264149",
"events": {
"http://schemas.openid.net/event/backchannel-logout": {},
"revoke_offline_access": true
}
}
Run Code Online (Sandbox Code Playgroud)
此时,我收到了来自 SSO 提供商 keycloak 的注销请求,其中包含sub用户的唯一 ID,这样我就可以知道我想要注销的用户。
但基本上我只是收到一个包含logout_token来自 keycloak 的HttpRequest
String logoutToken = request.getParameter("logout_token");
然后我将其转换为 JWT 令牌对象,我可以读取它。
但我完全退出了任何用户会话,此时request.getSession()用户在浏览器中打开的所有会话都不会返回给我,而且我没有任何访问令牌可供使用,因为注销导致无效,我只要有这个注销令牌即可。
所以上面所有的演讲都是为了解释我在做什么。但真正的问题可能是。
如何从与浏览器会话无关的请求中找到该会话并使之无效?
即使我们放弃 SSO 上下文和 LogoutToken,如果作为管理员我想要一个接受 userId 值的管理员注销端点,并且在这个端点上我想终止该用户的任何会话,但我不是这个用户(我是管理员)我该怎么做?
该项目没有使用 spring,我们使用的是一个名为 XWiki 的平台,我认为它只是带有javax.servlet-apikeycloak 适配器的 JEE。
import javax.servlet.http.HttpServletRequest;
import org.keycloak.KeycloakSecurityContext;
Run Code Online (Sandbox Code Playgroud)
对我有用的是使用前通道注销而不是后通道。我还希望在用户从 App-A 注销后清除会话详细信息。在反向通道注销中,您将不会收到会话详细信息。
请注意,前通道注销 URL 具有 GET 方法。
| 归档时间: |
|
| 查看次数: |
1427 次 |
| 最近记录: |