问题描述
我有一个密钥遮盖停靠容器(拉出的图像joss/keyloak)和一个Django 2.2web容器。对于Django与KeyCloak的集成,使用social-auth-app-django
。登录工作正常。现在尝试按照以下说明使用python-keycloak实现注销:
https://github.com/marcospereirampj/python-keycloak:
from keycloak import KeycloakOpenID
keycloak_openid = KeycloakOpenID(server_url="http://<my IP>:8080/auth/",
client_id="<client_id>",
realm_name="<my realm name>",
client_secret_key="<my secret>",
verify=True)
config_well_know = keycloak_openid.well_know()
token = keycloak_openid.token("<username>", "<password>")
print(token) # all tokens returned ok
userinfo = keycloak_openid.userinfo(token['access_token'])
print ("userinfo:", userinfo) # userinfo returned ok
keycloak_openid.logout(token['refresh_token'])
在容器日志中:Some clients have been not been logged out for user <username> in <my realm name> realm: <client_id>
未注销,仍可以浏览网站。
丢失了什么?谢谢
更新也许我明白问题所在。我从keycloak_openid.token()
调用中获得的令牌不是登录时为我生成的令牌。可以提供给keycloak_openid.logout()
调用以使其工作唯一令牌是原始令牌(具体地说,是令牌DICT的‘REFRESH_TOKEN’密钥值)。调用keycloak_openid.refresh_token()
还会发出一个新令牌,该令牌作为注销凭据被拒绝。但是最初发出的REFRESH_TOKEN似乎没有存储在任何地方-会话、cookie或密钥罩数据库。(注意:我确实找到了access_token
,它在social_auth_usersocialauth
表的Django DB中,但我需要refresh_token
)。但是,它在登录时被转储到控制台输出,所以如果我复制它并用它调用keycloak_openid.logout()
,它就会从keycoak注销。问题是在哪里可以找到原始REFRESH_TOKEN?
推荐答案
我以前也遇到过同样的问题。有帮助的是
- 转到
admin
页面并将您的用户定位到realm
- 打开浏览器的开发者控制台,监控
networks
- 转到密钥罩上的
sessions
选项卡,然后单击log out
- 观察正在调用的终结点,并在您的python后端中模拟该终结点,并在请求中使用适当的标头。
希望这能有所帮助!
这篇关于包含KeycloakOpenID:Logout的Python-keyshaak包不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!