1
- [ ![ CircleCI] ( https://github.com/marcospereirampj/python-keycloak/actions/workflows/daily.yaml/badge.svg )] ( https://github.com/marcospereirampj/python-keycloak/ )
2
1
[ ![ Documentation Status] ( https://readthedocs.org/projects/python-keycloak/badge/?version=latest )] ( http://python-keycloak.readthedocs.io/en/latest/?badge=latest )
3
2
3
+ # Async Pilot Keycloak fork
4
+ This repo is a fork of https://github.com/marcospereirampj/python-keycloak at version 2.9.0 by Indoc Research to support async.
5
+
4
6
# Python Keycloak
5
7
6
8
For review- see https://github.com/marcospereirampj/python-keycloak
@@ -15,14 +17,14 @@ For review- see https://github.com/marcospereirampj/python-keycloak
15
17
16
18
### Manually
17
19
18
- ` $ python setup.py install `
20
+ ` $ pip install . `
19
21
20
22
## Dependencies
21
23
22
24
python-keycloak depends on:
23
25
24
26
- Python 3
25
- - [ requests ] ( https://requests.readthedocs.io )
27
+ - [ httpx ] ( https://www.python-httpx.org/ )
26
28
- [ python-jose] ( http://python-jose.readthedocs.io/en/latest/ )
27
29
- [ urllib3] ( https://urllib3.readthedocs.io/en/stable/ )
28
30
@@ -70,73 +72,76 @@ keycloak_openid = KeycloakOpenID(server_url="http://localhost:8080/auth/",
70
72
client_secret_key = " secret" )
71
73
72
74
# Get WellKnow
73
- config_well_known = keycloak_openid.well_known()
75
+ config_well_known = await keycloak_openid.well_known()
74
76
75
77
# Get Code With Oauth Authorization Request
76
- auth_url = keycloak_openid.auth_url(
78
+ auth_url = await keycloak_openid.auth_url(
77
79
redirect_uri = " your_call_back_url" ,
78
80
scope = " email" ,
79
81
state = " your_state_info" )
80
82
81
83
# Get Access Token With Code
82
- access_token = keycloak_openid.token(
84
+ access_token = await keycloak_openid.token(
83
85
grant_type = ' authorization_code' ,
84
86
code = ' the_code_you_get_from_auth_url_callback' ,
85
87
redirect_uri = " your_call_back_url" )
86
88
87
89
88
90
# Get Token
89
- token = keycloak_openid.token(" user" , " password" )
90
- token = keycloak_openid.token(" user" , " password" , totp = " 012345" )
91
+ token = await keycloak_openid.token(" user" , " password" )
92
+ token = await keycloak_openid.token(" user" , " password" , totp = " 012345" )
91
93
92
94
# Get token using Token Exchange
93
- token = keycloak_openid.exchange_token(token[' access_token' ], " my_client" , " other_client" , " some_user" )
95
+ token = await keycloak_openid.exchange_token(token[' access_token' ], " my_client" , " other_client" , " some_user" )
94
96
95
97
# Get Userinfo
96
- userinfo = keycloak_openid.userinfo(token[' access_token' ])
98
+ userinfo = await keycloak_openid.userinfo(token[' access_token' ])
97
99
98
100
# Refresh token
99
- token = keycloak_openid.refresh_token(token[' refresh_token' ])
101
+ token = await keycloak_openid.refresh_token(token[' refresh_token' ])
100
102
101
103
# Logout
102
- keycloak_openid.logout(token[' refresh_token' ])
104
+ await keycloak_openid.logout(token[' refresh_token' ])
103
105
104
106
# Get Certs
105
- certs = keycloak_openid.certs()
107
+ certs = await keycloak_openid.certs()
106
108
107
109
# Get RPT (Entitlement)
108
- token = keycloak_openid.token(" user" , " password" )
109
- rpt = keycloak_openid.entitlement(token[' access_token' ], " resource_id" )
110
+ token = await keycloak_openid.token(" user" , " password" )
111
+ rpt = await keycloak_openid.entitlement(token[' access_token' ], " resource_id" )
110
112
111
113
# Instropect RPT
112
- token_rpt_info = keycloak_openid.introspect(keycloak_openid.introspect(token[' access_token' ], rpt = rpt[' rpt' ],
114
+ token_rpt_info = await keycloak_openid.introspect(keycloak_openid.introspect(token[' access_token' ], rpt = rpt[' rpt' ],
113
115
token_type_hint = " requesting_party_token" ))
114
116
115
117
# Introspect Token
116
- token_info = keycloak_openid.introspect(token[' access_token' ])
118
+ token_info = await keycloak_openid.introspect(token[' access_token' ])
117
119
118
120
# Decode Token
119
121
KEYCLOAK_PUBLIC_KEY = " -----BEGIN PUBLIC KEY-----\n " + keycloak_openid.public_key() + " \n -----END PUBLIC KEY-----"
120
122
options = {" verify_signature" : True , " verify_aud" : True , " verify_exp" : True }
121
- token_info = keycloak_openid.decode_token(token[' access_token' ], key = KEYCLOAK_PUBLIC_KEY , options = options)
123
+ token_info = await keycloak_openid.decode_token(token[' access_token' ], key = KEYCLOAK_PUBLIC_KEY , options = options)
122
124
123
125
# Get permissions by token
124
- token = keycloak_openid.token(" user" , " password" )
125
- keycloak_openid.load_authorization_config(" example-authz-config.json" )
126
- policies = keycloak_openid.get_policies(token[' access_token' ], method_token_info = ' decode' , key = KEYCLOAK_PUBLIC_KEY )
127
- permissions = keycloak_openid.get_permissions(token[' access_token' ], method_token_info = ' introspect' )
126
+ token = await keycloak_openid.token(" user" , " password" )
127
+ await keycloak_openid.load_authorization_config(" example-authz-config.json" )
128
+ await policies = keycloak_openid.get_policies(token[' access_token' ], method_token_info = ' decode' , key = KEYCLOAK_PUBLIC_KEY )
129
+ await permissions = keycloak_openid.get_permissions(token[' access_token' ], method_token_info = ' introspect' )
128
130
129
131
# Get UMA-permissions by token
130
- token = keycloak_openid.token(" user" , " password" )
131
- permissions = keycloak_openid.uma_permissions(token[' access_token' ])
132
+ # Currently unsupported for async version
133
+ # token = keycloak_openid.token("user", "password")
134
+ # permissions = keycloak_openid.uma_permissions(token['access_token'])
132
135
133
136
# Get UMA-permissions by token with specific resource and scope requested
134
- token = keycloak_openid.token(" user" , " password" )
135
- permissions = keycloak_openid.uma_permissions(token[' access_token' ], permissions = " Resource#Scope" )
137
+ # Currently unsupported for async version
138
+ # token = keycloak_openid.token("user", "password")
139
+ # permissions = keycloak_openid.uma_permissions(token['access_token'], permissions="Resource#Scope")
136
140
137
141
# Get auth status for a specific resource and scope by token
138
- token = keycloak_openid.token(" user" , " password" )
139
- auth_status = keycloak_openid.has_uma_access(token[' access_token' ], " Resource#Scope" )
142
+ # Currently unsupported for async version
143
+ # token = keycloak_openid.token("user", "password")
144
+ # auth_status = keycloak_openid.has_uma_access(token['access_token'], "Resource#Scope")
140
145
141
146
142
147
# KEYCLOAK ADMIN
@@ -150,33 +155,34 @@ keycloak_admin = KeycloakAdmin(server_url="http://localhost:8080/auth/",
150
155
user_realm_name = " only_if_other_realm_than_master" ,
151
156
client_secret_key = " client-secret" ,
152
157
verify = True )
158
+ await keycloak_admin.connect()
153
159
154
160
# Add user
155
- new_user
= keycloak_admin.create_user({
" email" :
" [email protected] " ,
161
+ new_user
= await keycloak_admin.create_user({
" email" :
" [email protected] " ,
156
162
157
163
" enabled" : True ,
158
164
" firstName" : " Example" ,
159
165
" lastName" : " Example" })
160
166
161
167
# Add user and raise exception if username already exists
162
168
# exist_ok currently defaults to True for backwards compatibility reasons
163
- new_user
= keycloak_admin.create_user({
" email" :
" [email protected] " ,
169
+ new_user
= await keycloak_admin.create_user({
" email" :
" [email protected] " ,
164
170
165
171
" enabled" : True ,
166
172
" firstName" : " Example" ,
167
173
" lastName" : " Example" },
168
174
exist_ok = False )
169
175
170
176
# Add user and set password
171
- new_user
= keycloak_admin.create_user({
" email" :
" [email protected] " ,
177
+ new_user
= await keycloak_admin.create_user({
" email" :
" [email protected] " ,
172
178
173
179
" enabled" : True ,
174
180
" firstName" : " Example" ,
175
181
" lastName" : " Example" ,
176
182
" credentials" : [{" value" : " secret" ," type" : " password" ,}]})
177
183
178
184
# Add user and specify a locale
179
- new_user
= keycloak_admin.create_user({
" email" :
" [email protected] " ,
185
+ new_user
= await keycloak_admin.create_user({
" email" :
" [email protected] " ,
180
186
181
187
" enabled" : True ,
182
188
" firstName" : " Example" ,
@@ -186,92 +192,92 @@ new_user = keycloak_admin.create_user({"email": "
[email protected] ",
186
192
}})
187
193
188
194
# User counter
189
- count_users = keycloak_admin.users_count()
195
+ count_users = await keycloak_admin.users_count()
190
196
191
197
# Get users Returns a list of users, filtered according to query parameters
192
- users = keycloak_admin.get_users({})
198
+ users = await keycloak_admin.get_users({})
193
199
194
200
# Get user ID from username
195
- user_id_keycloak = keycloak_admin.get_user_id(" username-keycloak" )
201
+ user_id_keycloak = await keycloak_admin.get_user_id(" username-keycloak" )
196
202
197
203
# Get User
198
- user = keycloak_admin.get_user(" user-id-keycloak" )
204
+ user = await keycloak_admin.get_user(" user-id-keycloak" )
199
205
200
206
# Update User
201
- response = keycloak_admin.update_user(user_id = " user-id-keycloak" ,
207
+ response = await keycloak_admin.update_user(user_id = " user-id-keycloak" ,
202
208
payload = {' firstName' : ' Example Update' })
203
209
204
210
# Update User Password
205
- response = keycloak_admin.set_user_password(user_id = " user-id-keycloak" , password = " secret" , temporary = True )
211
+ response = await keycloak_admin.set_user_password(user_id = " user-id-keycloak" , password = " secret" , temporary = True )
206
212
207
213
# Get User Credentials
208
- credentials = keycloak_admin.get_credentials(user_id = ' user_id' )
214
+ credentials = await keycloak_admin.get_credentials(user_id = ' user_id' )
209
215
210
216
# Get User Credential by ID
211
- credential = keycloak_admin.get_credential(user_id = ' user_id' , credential_id = ' credential_id' )
217
+ credential = await keycloak_admin.get_credential(user_id = ' user_id' , credential_id = ' credential_id' )
212
218
213
219
# Delete User Credential
214
- response = keycloak_admin.delete_credential(user_id = ' user_id' , credential_id = ' credential_id' )
220
+ response = await keycloak_admin.delete_credential(user_id = ' user_id' , credential_id = ' credential_id' )
215
221
216
222
# Delete User
217
- response = keycloak_admin.delete_user(user_id = " user-id-keycloak" )
223
+ response = await keycloak_admin.delete_user(user_id = " user-id-keycloak" )
218
224
219
225
# Get consents granted by the user
220
- consents = keycloak_admin.consents_user(user_id = " user-id-keycloak" )
226
+ consents = await keycloak_admin.consents_user(user_id = " user-id-keycloak" )
221
227
222
228
# Send User Action
223
- response = keycloak_admin.send_update_account(user_id = " user-id-keycloak" ,
229
+ response = await keycloak_admin.send_update_account(user_id = " user-id-keycloak" ,
224
230
payload = [' UPDATE_PASSWORD' ])
225
231
226
232
# Send Verify Email
227
- response = keycloak_admin.send_verify_email(user_id = " user-id-keycloak" )
233
+ response = await keycloak_admin.send_verify_email(user_id = " user-id-keycloak" )
228
234
229
235
# Get sessions associated with the user
230
- sessions = keycloak_admin.get_sessions(user_id = " user-id-keycloak" )
236
+ sessions = await keycloak_admin.get_sessions(user_id = " user-id-keycloak" )
231
237
232
238
# Get themes, social providers, auth providers, and event listeners available on this server
233
- server_info = keycloak_admin.get_server_info()
239
+ server_info = await keycloak_admin.get_server_info()
234
240
235
241
# Get clients belonging to the realm Returns a list of clients belonging to the realm
236
- clients = keycloak_admin.get_clients()
242
+ clients = await keycloak_admin.get_clients()
237
243
238
244
# Get client - id (not client-id) from client by name
239
- client_id = keycloak_admin.get_client_id(" my-client" )
245
+ client_id = await keycloak_admin.get_client_id(" my-client" )
240
246
241
247
# Get representation of the client - id of client (not client-id)
242
- client = keycloak_admin.get_client(client_id = " client_id" )
248
+ client = await keycloak_admin.get_client(client_id = " client_id" )
243
249
244
250
# Get all roles for the realm or client
245
- realm_roles = keycloak_admin.get_realm_roles()
251
+ realm_roles = await keycloak_admin.get_realm_roles()
246
252
247
253
# Get all roles for the client
248
- client_roles = keycloak_admin.get_client_roles(client_id = " client_id" )
254
+ client_roles = await keycloak_admin.get_client_roles(client_id = " client_id" )
249
255
250
256
# Get client role
251
- role = keycloak_admin.get_client_role(client_id = " client_id" , role_name = " role_name" )
257
+ role = await keycloak_admin.get_client_role(client_id = " client_id" , role_name = " role_name" )
252
258
253
259
# Warning: Deprecated
254
260
# Get client role id from name
255
- role_id = keycloak_admin.get_client_role_id(client_id = " client_id" , role_name = " test" )
261
+ role_id = await keycloak_admin.get_client_role_id(client_id = " client_id" , role_name = " test" )
256
262
257
263
# Create client role
258
- keycloak_admin.create_client_role(client_role_id = ' client_id' , payload = {' name' : ' roleName' , ' clientRole' : True })
264
+ await keycloak_admin.create_client_role(client_role_id = ' client_id' , payload = {' name' : ' roleName' , ' clientRole' : True })
259
265
260
266
# Assign client role to user. Note that BOTH role_name and role_id appear to be required.
261
- keycloak_admin.assign_client_role(client_id = " client_id" , user_id = " user_id" , role_id = " role_id" , role_name = " test" )
267
+ await keycloak_admin.assign_client_role(client_id = " client_id" , user_id = " user_id" , role_id = " role_id" , role_name = " test" )
262
268
263
269
# Retrieve client roles of a user.
264
- keycloak_admin.get_client_roles_of_user(user_id = " user_id" , client_id = " client_id" )
270
+ await keycloak_admin.get_client_roles_of_user(user_id = " user_id" , client_id = " client_id" )
265
271
266
272
# Retrieve available client roles of a user.
267
- keycloak_admin.get_available_client_roles_of_user(user_id = " user_id" , client_id = " client_id" )
273
+ await keycloak_admin.get_available_client_roles_of_user(user_id = " user_id" , client_id = " client_id" )
268
274
269
275
# Retrieve composite client roles of a user.
270
- keycloak_admin.get_composite_client_roles_of_user(user_id = " user_id" , client_id = " client_id" )
276
+ await keycloak_admin.get_composite_client_roles_of_user(user_id = " user_id" , client_id = " client_id" )
271
277
272
278
# Delete client roles of a user.
273
- keycloak_admin.delete_client_roles_of_user(client_id = " client_id" , user_id = " user_id" , roles = {" id" : " role-id" })
274
- keycloak_admin.delete_client_roles_of_user(client_id = " client_id" , user_id = " user_id" , roles = [{" id" : " role-id_1" }, {" id" : " role-id_2" }])
279
+ await keycloak_admin.delete_client_roles_of_user(client_id = " client_id" , user_id = " user_id" , roles = {" id" : " role-id" })
280
+ await keycloak_admin.delete_client_roles_of_user(client_id = " client_id" , user_id = " user_id" , roles = [{" id" : " role-id_1" }, {" id" : " role-id_2" }])
275
281
276
282
# Get all client authorization resources
277
283
client_resources = get_client_authz_resources(client_id = " client_id" )
@@ -286,62 +292,62 @@ client_permissions = get_client_authz_permissions(client_id="client_id")
286
292
client_policies = get_client_authz_policies(client_id = " client_id" )
287
293
288
294
# Create new group
289
- group = keycloak_admin.create_group({" name" : " Example Group" })
295
+ group = await keycloak_admin.create_group({" name" : " Example Group" })
290
296
291
297
# Get all groups
292
- groups = keycloak_admin.get_groups()
298
+ groups = await keycloak_admin.get_groups()
293
299
294
300
# Get group
295
- group = keycloak_admin.get_group(group_id = ' group_id' )
301
+ group = await keycloak_admin.get_group(group_id = ' group_id' )
296
302
297
303
# Get group by name
298
- group = keycloak_admin.get_group_by_path(path = ' /group/subgroup' , search_in_subgroups = True )
304
+ group = await keycloak_admin.get_group_by_path(path = ' /group/subgroup' , search_in_subgroups = True )
299
305
300
306
# Function to trigger user sync from provider
301
307
sync_users(storage_id = " storage_di" , action = " action" )
302
308
303
309
# Get client role id from name
304
- role_id = keycloak_admin.get_client_role_id(client_id = client_id, role_name = " test" )
310
+ role_id = await keycloak_admin.get_client_role_id(client_id = client_id, role_name = " test" )
305
311
306
312
# Get all roles for the realm or client
307
- realm_roles = keycloak_admin.get_roles()
313
+ realm_roles = await keycloak_admin.get_roles()
308
314
309
315
# Assign client role to user. Note that BOTH role_name and role_id appear to be required.
310
- keycloak_admin.assign_client_role(client_id = client_id, user_id = user_id, role_id = role_id, role_name = " test" )
316
+ await keycloak_admin.assign_client_role(client_id = client_id, user_id = user_id, role_id = role_id, role_name = " test" )
311
317
312
318
# Assign realm roles to user
313
- keycloak_admin.assign_realm_roles(user_id = user_id, roles = realm_roles)
319
+ await keycloak_admin.assign_realm_roles(user_id = user_id, roles = realm_roles)
314
320
315
321
# Assign realm roles to client's scope
316
- keycloak_admin.assign_realm_roles_to_client_scope(client_id = client_id, roles = realm_roles)
322
+ await keycloak_admin.assign_realm_roles_to_client_scope(client_id = client_id, roles = realm_roles)
317
323
318
324
# Get realm roles assigned to client's scope
319
- keycloak_admin.get_realm_roles_of_client_scope(client_id = client_id)
325
+ await keycloak_admin.get_realm_roles_of_client_scope(client_id = client_id)
320
326
321
327
# Remove realm roles assigned to client's scope
322
- keycloak_admin.delete_realm_roles_of_client_scope(client_id = client_id, roles = realm_roles)
328
+ await keycloak_admin.delete_realm_roles_of_client_scope(client_id = client_id, roles = realm_roles)
323
329
324
- another_client_id = keycloak_admin.get_client_id(" my-client-2" )
330
+ another_client_id = await keycloak_admin.get_client_id(" my-client-2" )
325
331
326
332
# Assign client roles to client's scope
327
- keycloak_admin.assign_client_roles_to_client_scope(client_id = another_client_id, client_roles_owner_id = client_id, roles = client_roles)
333
+ await keycloak_admin.assign_client_roles_to_client_scope(client_id = another_client_id, client_roles_owner_id = client_id, roles = client_roles)
328
334
329
335
# Get client roles assigned to client's scope
330
- keycloak_admin.get_client_roles_of_client_scope(client_id = another_client_id, client_roles_owner_id = client_id)
336
+ await keycloak_admin.get_client_roles_of_client_scope(client_id = another_client_id, client_roles_owner_id = client_id)
331
337
332
338
# Remove client roles assigned to client's scope
333
- keycloak_admin.delete_client_roles_of_client_scope(client_id = another_client_id, client_roles_owner_id = client_id, roles = client_roles)
339
+ await keycloak_admin.delete_client_roles_of_client_scope(client_id = another_client_id, client_roles_owner_id = client_id, roles = client_roles)
334
340
335
341
# Get all ID Providers
336
- idps = keycloak_admin.get_idps()
342
+ idps = await keycloak_admin.get_idps()
337
343
338
344
# Create a new Realm
339
- keycloak_admin.create_realm(payload = {" realm" : " demo" }, skip_exists = False )
345
+ await keycloak_admin.create_realm(payload = {" realm" : " demo" }, skip_exists = False )
340
346
341
347
# Changing Realm
342
- keycloak_admin = KeycloakAdmin(realm_name = " main" , ... )
343
- keycloak_admin.get_users() # Get user in main realm
344
- keycloak_admin.realm_name = " demo" # Change realm to 'demo'
345
- keycloak_admin.get_users() # Get users in realm 'demo'
346
- keycloak_admin.create_user(... ) # Creates a new user in 'demo'
348
+ await keycloak_admin = KeycloakAdmin(realm_name = " main" , ... )
349
+ await keycloak_admin.get_users() # Get user in main realm
350
+ await keycloak_admin.realm_name = " demo" # Change realm to 'demo'
351
+ await keycloak_admin.get_users() # Get users in realm 'demo'
352
+ await keycloak_admin.create_user(... ) # Creates a new user in 'demo'
347
353
```
0 commit comments