带有KeycloakOpenID的python-keycloak软件包:注销不起作用

时间:2019-12-03 17:38:03

标签: client token keycloak logout

我有一个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?

1 个答案:

答案 0 :(得分:0)

我曾经遇到过同样的问题。有用的是

  1. 转到admin页并将用户定位在realm
  2. 打开浏览器的开发人员控制台并监视networks
  3. 转到密钥斗篷上的sessions标签,然后单击log out
  4. 观察哪个端点被调用,并在python后端中模拟该端点,并在请求中使用适当的标头。

希望这会有所帮助!