oauth2.0 Keycloak用户注销

nsc4cvqm  于 2023-10-15  发布在  其他
关注(0)|答案(3)|浏览(209)

我在允许用户从使用Keycloak进行访问管理的应用程序中注销时遇到了麻烦。
我发现这个主题在这里和那里被讨论,但没有明确的指示如何处理注销。
我试图导致用户注销,将浏览器重定向到以下格式的端点:
https://example.com/auth/realms/myrealm/protocol/openid-connect/logout?id_token_hint=mytoken&post_logout_redirect_uri=https://example.com/initialpage/
我使用的“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 WARN [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消息。
我不知道现在该怎么办。任何帮助都是感激不尽的。
谢谢

dzhpxtsq

dzhpxtsq1#

默认情况下,/token端点仅返回访问令牌。默认情况下,成功认证后,不会返回刷新令牌,也不会在Keycloak端创建用户会话。由于缺少刷新令牌,当访问令牌过期时需要重新认证。但是,这种情况并不意味着Keycloak服务器会有任何额外的开销,因为默认情况下不会创建会话。
在这种情况下,注销是不必要的。但是,可以通过向OAuth2吊销端点发送请求来吊销已颁发的访问令牌,如OpenID Connect Endpoints部分所述:

/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_tokenrefresh_token作为值来定义要撤销的令牌类型。

pxyaymoc

pxyaymoc2#

在重定向之前,您必须将scope=openid添加到对http://example.com/auth/realms/playipintern/protocol/openid-connect/auth的初始请求中(注意,最后是/auth而不是/token)。
你可以在这篇文章中找到更多的信息和解释。

oknwwptz

oknwwptz3#

有两种方法可以从keycloack注销
1.按用户ID注销。
将清除所有可用会话

POST: {{Base_URL}}/admin/realms/{{Realm_name}}/users/bac5ae23-9ad6-4bb5-88b4-70f1b83a416a/logout

1.使用刷新令牌注销这将只清除该用户正在进行的会话
POST:{{Base_URL}}/realms/{{Realm_name}}/protocol/openid-connect/logout

注意:刷新令牌与keycloak登录响应一起给出

相关问题