You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Keycloak 22.0.3 API调用异常:get_users触发TypeError错误

解决KeycloakAdmin调用get_users的TypeError错误

错误原因

你把access_token直接传给了get_users方法,但这个方法的参数是用户过滤查询字典(比如分页、用户名过滤等),不是access_token。而且你初始化KeycloakAdmin时已经传入了用户名和密码,库会自动帮你获取、管理token,根本不需要手动传token进去。

错误栈里的argument after ** must be a mapping, not str,就是因为你传了字符串类型的token,而方法内部期望用**解包一个字典参数。


修复方案

方案1:直接使用初始化好的KeycloakAdmin实例(推荐)

删掉手动传token的代码,直接调用get_users,库会自动处理token逻辑:

# 初始化部分保持不变
keycloak_admin = KeycloakAdmin(server_url="http://0.0.0.0:8080/",
                               username="admin",
                               password="admin",
                               realm_name="master",
                               client_id="admin-cli",
                               verify=False)

# 直接调用get_users,不需要传access_token
users = keycloak_admin.get_users()

# 后续打印用户代码不变
for user in users:
    print(f"User ID: {user['id']}")
    print(f"Username: {user['username']}")
    print(f"Email: {user.get('email', 'N/A')}")
    print("------")

keycloak_admin.logout()

如果需要过滤用户(比如只查特定用户名、分页),可以传查询字典:

# 示例:查询用户名包含"test"的用户,最多返回10条
users = keycloak_admin.get_users({"username": "test", "max": 10})

方案2:用手动获取的token初始化KeycloakAdmin

如果你想自己管理token,初始化时不要传用户名密码,而是传入token参数:

import requests
from keycloak import KeycloakAdmin

# 先手动获取token(这部分代码保留)
url = "http://0.0.0.0:8080/realms/master/protocol/openid-connect/token"
data = {
    'client_id': 'admin-cli',
    'grant_type': 'password',
    'username': 'admin',
    'password': 'admin',
    'client_secret': 'YTC8x190ZsrV0pQZAWRqXPw9pKlbzniQ'
}
response = requests.post(url, data=data, verify=False)
if response.status_code == 200:
    token_data = response.json()
    access_token = token_data['access_token']
else:
    print('Failed to retrieve the access token. Status code:', response.status_code)
    exit()

# 用token初始化KeycloakAdmin,不要传username和password
keycloak_admin = KeycloakAdmin(server_url="http://0.0.0.0:8080/",
                               realm_name="master",
                               client_id="admin-cli",
                               token=access_token,
                               verify=False)

# 调用get_users,仍然不需要传token
users = keycloak_admin.get_users()

# 后续打印和登出代码不变
for user in users:
    print(f"User ID: {user['id']}")
    print(f"Username: {user['username']}")
    print(f"Email: {user.get('email', 'N/A')}")
    print("------")

keycloak_admin.logout()

内容的提问来源于stack exchange,提问作者tascio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 13:35:07