Оказывается, что документация неверна, я проверяю исходный код keycloak_admin.py
нашел определение функции assign_client_role()
:
def assign_client_role(self, user_id, client_id, roles):
"""
Assign a client role to a user
:param client_id: id of client (not client-id)
:param user_id: id of user
:param client_id: id of client containing role,
:param roles: roles list or role (use RoleRepresentation)
:return Keycloak server response
"""
payload = roles if isinstance(roles, list) else [roles]
params_path = {"realm-name": self.realm_name, "id": user_id, "client-id":client_id}
data_raw = self.connection.raw_post(URL_ADMIN_USER_CLIENT_ROLES.format(**params_path),
data=json.dumps(payload))
return raise_error_from_response(data_raw, KeycloakGetError, expected_code=204)
URL_ADMIN_USER_CLIENT_ROLES
определяется в urls_patterns.py
:
URL_ADMIN_USER_CLIENT_ROLES = "admin/realms/{realm-name}/users/{id}/role-mappings/clients/{client-id}"
Как вы можете видеть, realm-name
, userid
и client-id
используются для формирования URL-адреса, если один из этих параметров выйдет из строя, произойдет ошибка 404 из-за неправильного URL-адреса. Содержимое параметра roles
преобразуется в данные поста, поэтому, если формат параметра roles
неправильный, вероятно, будет 500 ошибок.
Чтобы получить правильный пример URL и правильную структуру данных ролей, я использовал браузер, чтобы вручную назначить роль, и проверять URL и публиковать данные json, отправленные браузером. Затем измените код, чтобы получить правильные данные URL и JSON. Ниже приведен окончательный код, который работает:
from keycloak import KeycloakAdmin
# make connection
admin = KeycloakAdmin(server_url = "https://xxx.xx.xx/auth/",
username = 'xx',
password = 'xxx',
realm_name = "xxx-xxx",
verify = True)
# get user id
userID = admin.get_user_id('one user's name')
# make sure you have the right realm name
realmName = 'xxx-xxx'
clientID = admin.get_client_id(realmName)
admin.assign_client_role(user_id = userID,
client_id = clientID,
roles = [{"id":"34a02t60-2435-40da-v911-a3ee1xm58921",
"name":"USER",
"description":"xxxxx",
"composite":False,
"clientRole":True,
"containerId":"aa102d71-4jk1-4u2a-a8w4-a6cv5j7626i1"}])