我有一个keycloak docker容器(拉到图像jboss / keycloak)和一个Django 2.2 Web容器。为了将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或keycloak数据库。 (注意:我确实找到了access_token
,它在social_auth_usersocialauth
表的django DB中,但是我需要refresh_token
)。但是,它会在登录时转储到控制台输出中,因此,如果我将其复制并调用keycloak_openid.logout()
,它将从keycoak中注销。问题是我在哪里可以找到原始的refresh_token?
答案 0 :(得分:0)
我曾经遇到过同样的问题。有用的是
admin
页并将用户定位在realm
networks
sessions
标签,然后单击log out
希望这会有所帮助!