summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2023-04-11 01:11:47 +0000
committerCoprDistGit <infra@openeuler.org>2023-04-11 01:11:47 +0000
commit4cbdf20b321b479e2aee7394f85c750a3d09881d (patch)
treedf5cf2229f8990e81643a8917e8b13e9bc61948b
parentec5d6fef746417b20f01072dfbaeb663ebcd08a4 (diff)
automatic import of python-keycloak-client
-rw-r--r--.gitignore1
-rw-r--r--python-keycloak-client.spec558
-rw-r--r--sources1
3 files changed, 560 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index e69de29..3e9c0e3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -0,0 +1 @@
+/keycloak-client-0.15.4.tar.gz
diff --git a/python-keycloak-client.spec b/python-keycloak-client.spec
new file mode 100644
index 0000000..e824796
--- /dev/null
+++ b/python-keycloak-client.spec
@@ -0,0 +1,558 @@
+%global _empty_manifest_terminate_build 0
+Name: python-keycloak-client
+Version: 0.15.4
+Release: 1
+Summary: keycloak-client(fork from python-keycloak) is a Python package providing access to the Keycloak API.
+License: The MIT License
+URL: https://github.com/ly798/python-keycloak.git
+Source0: https://mirrors.nju.edu.cn/pypi/web/packages/9b/2c/43b4c97b89c5f7b31a904e6080f27039b663504b727864b5d634727be46b/keycloak-client-0.15.4.tar.gz
+BuildArch: noarch
+
+
+%description
+For review- see https://bitbucket.org/agriness/python-keycloak
+**python-keycloak** is a Python package providing access to the Keycloak API.
+## Installation
+### Via Pypi Package:
+``` $ pip install keycloak-client ```
+### Manually
+``` $ python setup.py install ```
+## Dependencies
+python-keycloak depends on:
+* Python 3
+* [requests](http://docs.python-requests.org/en/master/)
+* [python-jose](http://python-jose.readthedocs.io/en/latest/)
+### Tests Dependencies
+* unittest
+* [httmock](https://github.com/patrys/httmock)
+## Bug reports
+Please report bugs and feature requests at
+https://bitbucket.org/agriness/python-keycloak/issues
+## Documentation
+The documentation for python-keycloak is available on [readthedocs](http://python-keycloak.readthedocs.io).
+## Contributors
+* [Agriness Team](http://www.agriness.com/pt/)
+* [Marcos Pereira](marcospereira.mpj@gmail.com)
+* [Martin Devlin](https://bitbucket.org/devlinmpearson/)
+* [Shon T. Urbas](https://bitbucket.org/surbas/)
+* [Markus Spanier](https://bitbucket.org/spanierm/)
+* [Remco Kranenburg](https://bitbucket.org/Remco47/)
+* [Armin](https://bitbucket.org/arminfelder/)
+* [njordr](https://bitbucket.org/njordr/)
+* [Josha Inglis](https://bitbucket.org/joshainglis/)
+* [Alex](https://bitbucket.org/alex_zel/)
+* [Ewan Jone](https://bitbucket.org/kisamoto/)
+## Usage
+```python
+from keycloak import KeycloakOpenID
+# Configure client
+keycloak_openid = KeycloakOpenID(server_url="http://localhost:8080/auth/",
+ client_id="example_client",
+ realm_name="example_realm",
+ client_secret_key="secret")
+# Get WellKnow
+config_well_know = keycloak_openid.well_know()
+# Get Token
+token = keycloak_openid.token("user", "password")
+token = keycloak_openid.token("user", "password", totp="012345")
+# Get Userinfo
+userinfo = keycloak_openid.userinfo(token['access_token'])
+# Refresh token
+token = keycloak_openid.refresh_token(token['refresh_token'])
+# Logout
+keycloak_openid.logout(token['refresh_token'])
+# Get Certs
+certs = keycloak_openid.certs()
+# Get RPT (Entitlement)
+token = keycloak_openid.token("user", "password")
+rpt = keycloak_openid.entitlement(token['access_token'], "resource_id")
+# Instropect RPT
+token_rpt_info = keycloak_openid.introspect(keycloak_openid.introspect(token['access_token'], rpt=rpt['rpt'],
+ token_type_hint="requesting_party_token"))
+# Introspect Token
+token_info = keycloak_openid.introspect(token['access_token']))
+# Decode Token
+KEYCLOAK_PUBLIC_KEY = "secret"
+options = {"verify_signature": True, "verify_aud": True, "exp": True}
+token_info = keycloak_openid.decode_token(token['access_token'], key=KEYCLOAK_PUBLIC_KEY, options=options)
+# Get permissions by token
+token = keycloak_openid.token("user", "password")
+keycloak_openid.load_authorization_config("example-authz-config.json")
+policies = keycloak_openid.get_policies(token['access_token'], method_token_info='decode', key=KEYCLOAK_PUBLIC_KEY)
+permissions = keycloak_openid.get_permissions(token['access_token'], method_token_info='introspect')
+# KEYCLOAK ADMIN
+from keycloak import KeycloakAdmin
+keycloak_admin = KeycloakAdmin(server_url="http://localhost:8080/auth/",
+ username='example-admin',
+ password='secret',
+ realm_name="example_realm",
+ verify=True)
+# Add user
+new_user = keycloak_admin.create_user({"email": "example@example.com",
+ "username": "example@example.com",
+ "enabled": True,
+ "firstName": "Example",
+ "lastName": "Example"})
+# Add user and set password
+new_user = keycloak_admin.create_user({"email": "example@example.com",
+ "username": "example@example.com",
+ "enabled": True,
+ "firstName": "Example",
+ "lastName": "Example",
+ "credentials": [{"value": "secret","type": "password",}]})
+# User counter
+count_users = keycloak_admin.users_count()
+# Get users Returns a list of users, filtered according to query parameters
+users = keycloak_admin.get_users({})
+# Get user ID from name
+user-id-keycloak = keycloak_admin.get_user_id("example@example.com")
+# Get User
+user = keycloak_admin.get_user("user-id-keycloak")
+# Update User
+response = keycloak_admin.update_user(user_id="user-id-keycloak",
+ payload={'firstName': 'Example Update'})
+# Update User Password
+response = set_user_password(user_id="user-id-keycloak", password="secret", temporary=True)
+# Delete User
+response = keycloak_admin.delete_user(user_id="user-id-keycloak")
+# Get consents granted by the user
+consents = keycloak_admin.consents_user(user_id="user-id-keycloak")
+# Send User Action
+response = keycloak_admin.send_update_account(user_id="user-id-keycloak",
+ payload=json.dumps(['UPDATE_PASSWORD']))
+# Send Verify Email
+response = keycloak_admin.send_verify_email(user_id="user-id-keycloak")
+# Get sessions associated with the user
+sessions = keycloak_admin.get_sessions(user_id="user-id-keycloak")
+# Get themes, social providers, auth providers, and event listeners available on this server
+server_info = keycloak_admin.get_server_info()
+# Get clients belonging to the realm Returns a list of clients belonging to the realm
+clients = keycloak_admin.get_clients()
+# Get client - id (not client-id) from client by name
+client_id=keycloak_admin.get_client_id("my-client")
+# Get representation of the client - id of client (not client-id)
+client = keycloak_admin.get_client(client_id="client_id")
+# Get all roles for the realm or client
+realm_roles = keycloak_admin.get_realm_roles()
+# Get all roles for the client
+client_roles = keycloak_admin.get_client_roles(client_id="client_id")
+# Get client role
+role = keycloak_admin.get_client_role(client_id="client_id", role_name="role_name")
+# Warning: Deprecated
+# Get client role id from name
+role_id = keycloak_admin.get_client_role_id(client_id="client_id", role_name="test")
+# Create client role
+keycloak_admin.create_client_role(client_id='client_id', {'name': 'roleName', 'clientRole': True})
+# Assign client role to user. Note that BOTH role_name and role_id appear to be required.
+keycloak_admin.assign_client_role(client_id="client_id", user_id="user_id", role_id="role_id", role_name="test")
+# Retrieve client roles of a user.
+keycloak_admin.get_client_roles_of_user(user_id="user_id", client_id="client_id")
+# Retrieve available client roles of a user.
+keycloak_admin.get_available_client_roles_of_user(user_id="user_id", client_id="client_id")
+# Retrieve composite client roles of a user.
+keycloak_admin.get_composite_client_roles_of_user(user_id="user_id", client_id="client_id")
+# Delete client roles of a user.
+keycloak_admin.delete_client_roles_of_user(client_id="client_id", user_id="user_id", roles={"id": "role-id"})
+keycloak_admin.delete_client_roles_of_user(client_id="client_id", user_id="user_id", roles=[{"id": "role-id_1"}, {"id": "role-id_2"}])
+# Create new group
+group = keycloak_admin.create_group(name="Example Group")
+# Get all groups
+groups = keycloak_admin.get_groups()
+# Get group
+group = keycloak_admin.get_group(group_id='group_id')
+# Get group by name
+group = keycloak_admin.get_group_by_path(path='/group/subgroup', search_in_subgroups=True)
+# Function to trigger user sync from provider
+sync_users(storage_id="storage_di", action="action")
+# Get client role id from name
+role_id = keycloak_admin.get_client_role_id(client_id=client_id, role_name="test")
+# Get all roles for the realm or client
+realm_roles = keycloak_admin.get_roles()
+# Assign client role to user. Note that BOTH role_name and role_id appear to be required.
+keycloak_admin.assign_client_role(client_id=client_id, user_id=user_id, role_id=role_id, role_name="test")
+# Get all ID Providers
+idps = keycloak_admin.get_idps()
+```
+
+%package -n python3-keycloak-client
+Summary: keycloak-client(fork from python-keycloak) is a Python package providing access to the Keycloak API.
+Provides: python-keycloak-client
+BuildRequires: python3-devel
+BuildRequires: python3-setuptools
+BuildRequires: python3-pip
+%description -n python3-keycloak-client
+For review- see https://bitbucket.org/agriness/python-keycloak
+**python-keycloak** is a Python package providing access to the Keycloak API.
+## Installation
+### Via Pypi Package:
+``` $ pip install keycloak-client ```
+### Manually
+``` $ python setup.py install ```
+## Dependencies
+python-keycloak depends on:
+* Python 3
+* [requests](http://docs.python-requests.org/en/master/)
+* [python-jose](http://python-jose.readthedocs.io/en/latest/)
+### Tests Dependencies
+* unittest
+* [httmock](https://github.com/patrys/httmock)
+## Bug reports
+Please report bugs and feature requests at
+https://bitbucket.org/agriness/python-keycloak/issues
+## Documentation
+The documentation for python-keycloak is available on [readthedocs](http://python-keycloak.readthedocs.io).
+## Contributors
+* [Agriness Team](http://www.agriness.com/pt/)
+* [Marcos Pereira](marcospereira.mpj@gmail.com)
+* [Martin Devlin](https://bitbucket.org/devlinmpearson/)
+* [Shon T. Urbas](https://bitbucket.org/surbas/)
+* [Markus Spanier](https://bitbucket.org/spanierm/)
+* [Remco Kranenburg](https://bitbucket.org/Remco47/)
+* [Armin](https://bitbucket.org/arminfelder/)
+* [njordr](https://bitbucket.org/njordr/)
+* [Josha Inglis](https://bitbucket.org/joshainglis/)
+* [Alex](https://bitbucket.org/alex_zel/)
+* [Ewan Jone](https://bitbucket.org/kisamoto/)
+## Usage
+```python
+from keycloak import KeycloakOpenID
+# Configure client
+keycloak_openid = KeycloakOpenID(server_url="http://localhost:8080/auth/",
+ client_id="example_client",
+ realm_name="example_realm",
+ client_secret_key="secret")
+# Get WellKnow
+config_well_know = keycloak_openid.well_know()
+# Get Token
+token = keycloak_openid.token("user", "password")
+token = keycloak_openid.token("user", "password", totp="012345")
+# Get Userinfo
+userinfo = keycloak_openid.userinfo(token['access_token'])
+# Refresh token
+token = keycloak_openid.refresh_token(token['refresh_token'])
+# Logout
+keycloak_openid.logout(token['refresh_token'])
+# Get Certs
+certs = keycloak_openid.certs()
+# Get RPT (Entitlement)
+token = keycloak_openid.token("user", "password")
+rpt = keycloak_openid.entitlement(token['access_token'], "resource_id")
+# Instropect RPT
+token_rpt_info = keycloak_openid.introspect(keycloak_openid.introspect(token['access_token'], rpt=rpt['rpt'],
+ token_type_hint="requesting_party_token"))
+# Introspect Token
+token_info = keycloak_openid.introspect(token['access_token']))
+# Decode Token
+KEYCLOAK_PUBLIC_KEY = "secret"
+options = {"verify_signature": True, "verify_aud": True, "exp": True}
+token_info = keycloak_openid.decode_token(token['access_token'], key=KEYCLOAK_PUBLIC_KEY, options=options)
+# Get permissions by token
+token = keycloak_openid.token("user", "password")
+keycloak_openid.load_authorization_config("example-authz-config.json")
+policies = keycloak_openid.get_policies(token['access_token'], method_token_info='decode', key=KEYCLOAK_PUBLIC_KEY)
+permissions = keycloak_openid.get_permissions(token['access_token'], method_token_info='introspect')
+# KEYCLOAK ADMIN
+from keycloak import KeycloakAdmin
+keycloak_admin = KeycloakAdmin(server_url="http://localhost:8080/auth/",
+ username='example-admin',
+ password='secret',
+ realm_name="example_realm",
+ verify=True)
+# Add user
+new_user = keycloak_admin.create_user({"email": "example@example.com",
+ "username": "example@example.com",
+ "enabled": True,
+ "firstName": "Example",
+ "lastName": "Example"})
+# Add user and set password
+new_user = keycloak_admin.create_user({"email": "example@example.com",
+ "username": "example@example.com",
+ "enabled": True,
+ "firstName": "Example",
+ "lastName": "Example",
+ "credentials": [{"value": "secret","type": "password",}]})
+# User counter
+count_users = keycloak_admin.users_count()
+# Get users Returns a list of users, filtered according to query parameters
+users = keycloak_admin.get_users({})
+# Get user ID from name
+user-id-keycloak = keycloak_admin.get_user_id("example@example.com")
+# Get User
+user = keycloak_admin.get_user("user-id-keycloak")
+# Update User
+response = keycloak_admin.update_user(user_id="user-id-keycloak",
+ payload={'firstName': 'Example Update'})
+# Update User Password
+response = set_user_password(user_id="user-id-keycloak", password="secret", temporary=True)
+# Delete User
+response = keycloak_admin.delete_user(user_id="user-id-keycloak")
+# Get consents granted by the user
+consents = keycloak_admin.consents_user(user_id="user-id-keycloak")
+# Send User Action
+response = keycloak_admin.send_update_account(user_id="user-id-keycloak",
+ payload=json.dumps(['UPDATE_PASSWORD']))
+# Send Verify Email
+response = keycloak_admin.send_verify_email(user_id="user-id-keycloak")
+# Get sessions associated with the user
+sessions = keycloak_admin.get_sessions(user_id="user-id-keycloak")
+# Get themes, social providers, auth providers, and event listeners available on this server
+server_info = keycloak_admin.get_server_info()
+# Get clients belonging to the realm Returns a list of clients belonging to the realm
+clients = keycloak_admin.get_clients()
+# Get client - id (not client-id) from client by name
+client_id=keycloak_admin.get_client_id("my-client")
+# Get representation of the client - id of client (not client-id)
+client = keycloak_admin.get_client(client_id="client_id")
+# Get all roles for the realm or client
+realm_roles = keycloak_admin.get_realm_roles()
+# Get all roles for the client
+client_roles = keycloak_admin.get_client_roles(client_id="client_id")
+# Get client role
+role = keycloak_admin.get_client_role(client_id="client_id", role_name="role_name")
+# Warning: Deprecated
+# Get client role id from name
+role_id = keycloak_admin.get_client_role_id(client_id="client_id", role_name="test")
+# Create client role
+keycloak_admin.create_client_role(client_id='client_id', {'name': 'roleName', 'clientRole': True})
+# Assign client role to user. Note that BOTH role_name and role_id appear to be required.
+keycloak_admin.assign_client_role(client_id="client_id", user_id="user_id", role_id="role_id", role_name="test")
+# Retrieve client roles of a user.
+keycloak_admin.get_client_roles_of_user(user_id="user_id", client_id="client_id")
+# Retrieve available client roles of a user.
+keycloak_admin.get_available_client_roles_of_user(user_id="user_id", client_id="client_id")
+# Retrieve composite client roles of a user.
+keycloak_admin.get_composite_client_roles_of_user(user_id="user_id", client_id="client_id")
+# Delete client roles of a user.
+keycloak_admin.delete_client_roles_of_user(client_id="client_id", user_id="user_id", roles={"id": "role-id"})
+keycloak_admin.delete_client_roles_of_user(client_id="client_id", user_id="user_id", roles=[{"id": "role-id_1"}, {"id": "role-id_2"}])
+# Create new group
+group = keycloak_admin.create_group(name="Example Group")
+# Get all groups
+groups = keycloak_admin.get_groups()
+# Get group
+group = keycloak_admin.get_group(group_id='group_id')
+# Get group by name
+group = keycloak_admin.get_group_by_path(path='/group/subgroup', search_in_subgroups=True)
+# Function to trigger user sync from provider
+sync_users(storage_id="storage_di", action="action")
+# Get client role id from name
+role_id = keycloak_admin.get_client_role_id(client_id=client_id, role_name="test")
+# Get all roles for the realm or client
+realm_roles = keycloak_admin.get_roles()
+# Assign client role to user. Note that BOTH role_name and role_id appear to be required.
+keycloak_admin.assign_client_role(client_id=client_id, user_id=user_id, role_id=role_id, role_name="test")
+# Get all ID Providers
+idps = keycloak_admin.get_idps()
+```
+
+%package help
+Summary: Development documents and examples for keycloak-client
+Provides: python3-keycloak-client-doc
+%description help
+For review- see https://bitbucket.org/agriness/python-keycloak
+**python-keycloak** is a Python package providing access to the Keycloak API.
+## Installation
+### Via Pypi Package:
+``` $ pip install keycloak-client ```
+### Manually
+``` $ python setup.py install ```
+## Dependencies
+python-keycloak depends on:
+* Python 3
+* [requests](http://docs.python-requests.org/en/master/)
+* [python-jose](http://python-jose.readthedocs.io/en/latest/)
+### Tests Dependencies
+* unittest
+* [httmock](https://github.com/patrys/httmock)
+## Bug reports
+Please report bugs and feature requests at
+https://bitbucket.org/agriness/python-keycloak/issues
+## Documentation
+The documentation for python-keycloak is available on [readthedocs](http://python-keycloak.readthedocs.io).
+## Contributors
+* [Agriness Team](http://www.agriness.com/pt/)
+* [Marcos Pereira](marcospereira.mpj@gmail.com)
+* [Martin Devlin](https://bitbucket.org/devlinmpearson/)
+* [Shon T. Urbas](https://bitbucket.org/surbas/)
+* [Markus Spanier](https://bitbucket.org/spanierm/)
+* [Remco Kranenburg](https://bitbucket.org/Remco47/)
+* [Armin](https://bitbucket.org/arminfelder/)
+* [njordr](https://bitbucket.org/njordr/)
+* [Josha Inglis](https://bitbucket.org/joshainglis/)
+* [Alex](https://bitbucket.org/alex_zel/)
+* [Ewan Jone](https://bitbucket.org/kisamoto/)
+## Usage
+```python
+from keycloak import KeycloakOpenID
+# Configure client
+keycloak_openid = KeycloakOpenID(server_url="http://localhost:8080/auth/",
+ client_id="example_client",
+ realm_name="example_realm",
+ client_secret_key="secret")
+# Get WellKnow
+config_well_know = keycloak_openid.well_know()
+# Get Token
+token = keycloak_openid.token("user", "password")
+token = keycloak_openid.token("user", "password", totp="012345")
+# Get Userinfo
+userinfo = keycloak_openid.userinfo(token['access_token'])
+# Refresh token
+token = keycloak_openid.refresh_token(token['refresh_token'])
+# Logout
+keycloak_openid.logout(token['refresh_token'])
+# Get Certs
+certs = keycloak_openid.certs()
+# Get RPT (Entitlement)
+token = keycloak_openid.token("user", "password")
+rpt = keycloak_openid.entitlement(token['access_token'], "resource_id")
+# Instropect RPT
+token_rpt_info = keycloak_openid.introspect(keycloak_openid.introspect(token['access_token'], rpt=rpt['rpt'],
+ token_type_hint="requesting_party_token"))
+# Introspect Token
+token_info = keycloak_openid.introspect(token['access_token']))
+# Decode Token
+KEYCLOAK_PUBLIC_KEY = "secret"
+options = {"verify_signature": True, "verify_aud": True, "exp": True}
+token_info = keycloak_openid.decode_token(token['access_token'], key=KEYCLOAK_PUBLIC_KEY, options=options)
+# Get permissions by token
+token = keycloak_openid.token("user", "password")
+keycloak_openid.load_authorization_config("example-authz-config.json")
+policies = keycloak_openid.get_policies(token['access_token'], method_token_info='decode', key=KEYCLOAK_PUBLIC_KEY)
+permissions = keycloak_openid.get_permissions(token['access_token'], method_token_info='introspect')
+# KEYCLOAK ADMIN
+from keycloak import KeycloakAdmin
+keycloak_admin = KeycloakAdmin(server_url="http://localhost:8080/auth/",
+ username='example-admin',
+ password='secret',
+ realm_name="example_realm",
+ verify=True)
+# Add user
+new_user = keycloak_admin.create_user({"email": "example@example.com",
+ "username": "example@example.com",
+ "enabled": True,
+ "firstName": "Example",
+ "lastName": "Example"})
+# Add user and set password
+new_user = keycloak_admin.create_user({"email": "example@example.com",
+ "username": "example@example.com",
+ "enabled": True,
+ "firstName": "Example",
+ "lastName": "Example",
+ "credentials": [{"value": "secret","type": "password",}]})
+# User counter
+count_users = keycloak_admin.users_count()
+# Get users Returns a list of users, filtered according to query parameters
+users = keycloak_admin.get_users({})
+# Get user ID from name
+user-id-keycloak = keycloak_admin.get_user_id("example@example.com")
+# Get User
+user = keycloak_admin.get_user("user-id-keycloak")
+# Update User
+response = keycloak_admin.update_user(user_id="user-id-keycloak",
+ payload={'firstName': 'Example Update'})
+# Update User Password
+response = set_user_password(user_id="user-id-keycloak", password="secret", temporary=True)
+# Delete User
+response = keycloak_admin.delete_user(user_id="user-id-keycloak")
+# Get consents granted by the user
+consents = keycloak_admin.consents_user(user_id="user-id-keycloak")
+# Send User Action
+response = keycloak_admin.send_update_account(user_id="user-id-keycloak",
+ payload=json.dumps(['UPDATE_PASSWORD']))
+# Send Verify Email
+response = keycloak_admin.send_verify_email(user_id="user-id-keycloak")
+# Get sessions associated with the user
+sessions = keycloak_admin.get_sessions(user_id="user-id-keycloak")
+# Get themes, social providers, auth providers, and event listeners available on this server
+server_info = keycloak_admin.get_server_info()
+# Get clients belonging to the realm Returns a list of clients belonging to the realm
+clients = keycloak_admin.get_clients()
+# Get client - id (not client-id) from client by name
+client_id=keycloak_admin.get_client_id("my-client")
+# Get representation of the client - id of client (not client-id)
+client = keycloak_admin.get_client(client_id="client_id")
+# Get all roles for the realm or client
+realm_roles = keycloak_admin.get_realm_roles()
+# Get all roles for the client
+client_roles = keycloak_admin.get_client_roles(client_id="client_id")
+# Get client role
+role = keycloak_admin.get_client_role(client_id="client_id", role_name="role_name")
+# Warning: Deprecated
+# Get client role id from name
+role_id = keycloak_admin.get_client_role_id(client_id="client_id", role_name="test")
+# Create client role
+keycloak_admin.create_client_role(client_id='client_id', {'name': 'roleName', 'clientRole': True})
+# Assign client role to user. Note that BOTH role_name and role_id appear to be required.
+keycloak_admin.assign_client_role(client_id="client_id", user_id="user_id", role_id="role_id", role_name="test")
+# Retrieve client roles of a user.
+keycloak_admin.get_client_roles_of_user(user_id="user_id", client_id="client_id")
+# Retrieve available client roles of a user.
+keycloak_admin.get_available_client_roles_of_user(user_id="user_id", client_id="client_id")
+# Retrieve composite client roles of a user.
+keycloak_admin.get_composite_client_roles_of_user(user_id="user_id", client_id="client_id")
+# Delete client roles of a user.
+keycloak_admin.delete_client_roles_of_user(client_id="client_id", user_id="user_id", roles={"id": "role-id"})
+keycloak_admin.delete_client_roles_of_user(client_id="client_id", user_id="user_id", roles=[{"id": "role-id_1"}, {"id": "role-id_2"}])
+# Create new group
+group = keycloak_admin.create_group(name="Example Group")
+# Get all groups
+groups = keycloak_admin.get_groups()
+# Get group
+group = keycloak_admin.get_group(group_id='group_id')
+# Get group by name
+group = keycloak_admin.get_group_by_path(path='/group/subgroup', search_in_subgroups=True)
+# Function to trigger user sync from provider
+sync_users(storage_id="storage_di", action="action")
+# Get client role id from name
+role_id = keycloak_admin.get_client_role_id(client_id=client_id, role_name="test")
+# Get all roles for the realm or client
+realm_roles = keycloak_admin.get_roles()
+# Assign client role to user. Note that BOTH role_name and role_id appear to be required.
+keycloak_admin.assign_client_role(client_id=client_id, user_id=user_id, role_id=role_id, role_name="test")
+# Get all ID Providers
+idps = keycloak_admin.get_idps()
+```
+
+%prep
+%autosetup -n keycloak-client-0.15.4
+
+%build
+%py3_build
+
+%install
+%py3_install
+install -d -m755 %{buildroot}/%{_pkgdocdir}
+if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi
+if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi
+if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi
+if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi
+pushd %{buildroot}
+if [ -d usr/lib ]; then
+ find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/lib64 ]; then
+ find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/bin ]; then
+ find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/sbin ]; then
+ find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+touch doclist.lst
+if [ -d usr/share/man ]; then
+ find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst
+fi
+popd
+mv %{buildroot}/filelist.lst .
+mv %{buildroot}/doclist.lst .
+
+%files -n python3-keycloak-client -f filelist.lst
+%dir %{python3_sitelib}/*
+
+%files help -f doclist.lst
+%{_docdir}/*
+
+%changelog
+* Tue Apr 11 2023 Python_Bot <Python_Bot@openeuler.org> - 0.15.4-1
+- Package Spec generated
diff --git a/sources b/sources
new file mode 100644
index 0000000..0974698
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+2bdc9b327576c3a03ff1a00d174e0306 keycloak-client-0.15.4.tar.gz