我无法允许用户从使用 Keycloak 进行访问管理的应用程序注销。
我发现这个话题到处都有讨论,但没有关于如何处理注销的明确说明。
我试图导致用户注销,将浏览器重定向到以下格式的端点:
我用作“mytoken”的是我向端点发出 post 请求时获得的 access_token:
https://example.com/auth/realms/playipintern/protocol/openid-connect/token
向其传递如下参数:
grant_type="authorization_code"
code=code_obtained_from_a_url_to_which_keycloak_redirected_the_browser
client_id=client_id_created_using_key_cloak_gui
redirect_uri=the_to_which_keycloak_redirected_the_browser
并阅读回复正文。正文的内容是一个 json,如下所示:
{
'access_token': 'long_token_I_used_latter_as_token_hint_trying_to_logout',
'expires_in': 300,
'refresh_expires_in': 1800,
'refresh_token': 'other_long_token',
'token_type': 'bearer',
'not-before-policy': 0,
'session_state': 'a_shorter_code',
'scope': 'email profile'
}
我的注销尝试导致 Keycloaks 日志中出现以下消息:
22:53:51,686警告[org.keycloak.events](默认任务24)type = LOGOUT_ERROR,realmId = playipintern,clientId = null,userId = null,ipAddress = 192.168.16.1,error = invalid_token
回复说“我们很抱歉,会话未激活”。
现在我知道我应该使用 id_token 而不是 access_token 来注销,但在 json 中没有收到 id_token。
在某个地方,有人说我应该包括在内
scope=openid
在我用来获取令牌的参数中。我这样做了,希望在 json 中找到一个“id_token”字段,但没有任何改变。
其他人报告需要创建一个名为“openid”的范围(我相信使用 Keycloak 的 GUI)来获取令牌。这对我来说没有多大意义,但我还是尝试了一下,并再次使用 Keycloak 的 GUI 将刚刚创建的范围添加到客户端范围。再次,json 没有改变。
我尝试使用refresh_token作为id_token,但这也导致了无效的令牌消息。
我现在不知道该尝试什么。如有任何帮助,我们将不胜感激。
谢谢你。
/token
端点仅返回访问令牌。默认情况下,认证成功后,不会返回刷新令牌,并且 Keycloak 端不会创建用户会话。由于缺少刷新令牌,当访问令牌过期时需要重新进行身份验证。然而,这种情况并不意味着 Keycloak 服务器有任何额外的开销,因为默认情况下不会创建会话。
在这种情况下,无需注销。但是,可以通过向 OAuth2 撤销端点发送请求来撤销已颁发的访问令牌,如 OpenID Connect 端点部分中所述:
/realms/{realm-name}/protocol/openid-connect/revoke
示例:
POST /revoke HTTP/1.1
Host: server.example.com
Content-Type: application/x-www-form-urlencoded
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
token=45ghiukldjahdnhzdauz&token_type_hint=access_token
您需要用您的代币代替
45ghiukldjahdnhzdauz
。
token_type_hint
可以采用 access_token
或 refresh_token
作为值来定义要撤销的令牌类型。
在从您复制访问代码的位置进行重定向之前,您必须将
scope=openid
添加到您对 http://example.com/auth/realms/playipintern/protocol/openid-connect/auth
的初始请求中(请注意最后是 /auth
而不是 /token
)。
您可以在本文中找到更多信息和说明。