1
1
import pytest
2
- from django .contrib .auth import get_user
2
+ from django .contrib .auth import get_user , get_user_model
3
3
from django .contrib .auth .models import AnonymousUser
4
4
from django .test import RequestFactory
5
5
from django .urls import reverse
12
12
InvalidOIDCClientError ,
13
13
InvalidOIDCRedirectURIError ,
14
14
)
15
- from oauth2_provider .models import get_access_token_model , get_id_token_model , get_refresh_token_model
15
+ from oauth2_provider .models import (
16
+ get_access_token_model ,
17
+ get_application_model ,
18
+ get_id_token_model ,
19
+ get_refresh_token_model ,
20
+ )
16
21
from oauth2_provider .oauth2_validators import OAuth2Validator
17
22
from oauth2_provider .settings import oauth2_settings
18
- from oauth2_provider .views .oidc import RPInitiatedLogoutView , _load_id_token , _validate_claims
23
+ from oauth2_provider .views .oidc import (
24
+ RPInitiatedLogoutView ,
25
+ _load_id_token ,
26
+ _validate_claims ,
27
+ )
19
28
20
29
from . import presets
21
30
from .common_testing import OAuth2ProviderTestCase as TestCase
@@ -44,7 +53,10 @@ def test_get_connect_discovery_info(self):
44
53
],
45
54
"subject_types_supported" : ["public" ],
46
55
"id_token_signing_alg_values_supported" : ["RS256" , "HS256" ],
47
- "token_endpoint_auth_methods_supported" : ["client_secret_post" , "client_secret_basic" ],
56
+ "token_endpoint_auth_methods_supported" : [
57
+ "client_secret_post" ,
58
+ "client_secret_basic" ,
59
+ ],
48
60
"code_challenge_methods_supported" : ["plain" , "S256" ],
49
61
"claims_supported" : ["sub" ],
50
62
}
@@ -71,7 +83,10 @@ def test_get_connect_discovery_info_deprecated(self):
71
83
],
72
84
"subject_types_supported" : ["public" ],
73
85
"id_token_signing_alg_values_supported" : ["RS256" , "HS256" ],
74
- "token_endpoint_auth_methods_supported" : ["client_secret_post" , "client_secret_basic" ],
86
+ "token_endpoint_auth_methods_supported" : [
87
+ "client_secret_post" ,
88
+ "client_secret_basic" ,
89
+ ],
75
90
"code_challenge_methods_supported" : ["plain" , "S256" ],
76
91
"claims_supported" : ["sub" ],
77
92
}
@@ -98,7 +113,10 @@ def expect_json_response_with_rp_logout(self, base):
98
113
],
99
114
"subject_types_supported" : ["public" ],
100
115
"id_token_signing_alg_values_supported" : ["RS256" , "HS256" ],
101
- "token_endpoint_auth_methods_supported" : ["client_secret_post" , "client_secret_basic" ],
116
+ "token_endpoint_auth_methods_supported" : [
117
+ "client_secret_post" ,
118
+ "client_secret_basic" ,
119
+ ],
102
120
"code_challenge_methods_supported" : ["plain" , "S256" ],
103
121
"claims_supported" : ["sub" ],
104
122
"end_session_endpoint" : f"{ base } /logout/" ,
@@ -132,7 +150,10 @@ def test_get_connect_discovery_info_without_issuer_url(self):
132
150
],
133
151
"subject_types_supported" : ["public" ],
134
152
"id_token_signing_alg_values_supported" : ["RS256" , "HS256" ],
135
- "token_endpoint_auth_methods_supported" : ["client_secret_post" , "client_secret_basic" ],
153
+ "token_endpoint_auth_methods_supported" : [
154
+ "client_secret_post" ,
155
+ "client_secret_basic" ,
156
+ ],
136
157
"code_challenge_methods_supported" : ["plain" , "S256" ],
137
158
"claims_supported" : ["sub" ],
138
159
}
@@ -206,6 +227,42 @@ def test_get_jwks_info_multiple_rsa_keys(self):
206
227
assert response .json () == expected_response
207
228
208
229
230
+ @pytest .mark .usefixtures ("oauth2_settings" )
231
+ @pytest .mark .oauth2_settings (presets .OIDC_SETTINGS_SESSION_MANAGEMENT )
232
+ class TestAuthorizationView (TestCase ):
233
+ def test_session_state_is_present_in_url (self ):
234
+ User = get_user_model ()
235
+ Application = get_application_model ()
236
+
237
+ User .
objects .
create_user (
"test_user" ,
"[email protected] " ,
"123456" )
238
+ dev_user = User .
objects .
create_user (
"dev_user" ,
"[email protected] " ,
"123456" )
239
+
240
+ application = Application .objects .create (
241
+ name = "Test Application" ,
242
+ redirect_uris = (
243
+ "http://localhost http://example.com http://example.org custom-scheme://example.com"
244
+ ),
245
+ user = dev_user ,
246
+ client_type = Application .CLIENT_CONFIDENTIAL ,
247
+ authorization_grant_type = Application .GRANT_AUTHORIZATION_CODE ,
248
+ client_secret = "1234567890qwertyuiop" ,
249
+ )
250
+ self .client .login (username = "test_user" , password = "123456" )
251
+ response = self .client .post (
252
+ reverse ("oauth2_provider:authorize" ),
253
+ {
254
+ "client_id" : application .client_id ,
255
+ "response_type" : "code" ,
256
+ "state" : "random_state_string" ,
257
+ "scope" : "read write" ,
258
+ "redirect_uri" : "http://example.org" ,
259
+ "allow" : True ,
260
+ },
261
+ )
262
+ self .assertEqual (response .status_code , 302 )
263
+ self .assertTrue ("session_state" in response ["Location" ])
264
+
265
+
209
266
def mock_request ():
210
267
"""
211
268
Dummy request with an AnonymousUser attached.
@@ -335,7 +392,8 @@ def test_rp_initiated_logout_get(logged_in_client, rp_settings):
335
392
@pytest .mark .django_db (databases = retrieve_current_databases ())
336
393
def test_rp_initiated_logout_get_id_token (logged_in_client , oidc_tokens , rp_settings ):
337
394
rsp = logged_in_client .get (
338
- reverse ("oauth2_provider:rp-initiated-logout" ), data = {"id_token_hint" : oidc_tokens .id_token }
395
+ reverse ("oauth2_provider:rp-initiated-logout" ),
396
+ data = {"id_token_hint" : oidc_tokens .id_token },
339
397
)
340
398
assert rsp .status_code == 302
341
399
assert rsp ["Location" ] == "http://testserver/"
@@ -347,7 +405,8 @@ def test_rp_initiated_logout_get_revoked_id_token(logged_in_client, oidc_tokens,
347
405
validator = oauth2_settings .OAUTH2_VALIDATOR_CLASS ()
348
406
validator ._load_id_token (oidc_tokens .id_token ).revoke ()
349
407
rsp = logged_in_client .get (
350
- reverse ("oauth2_provider:rp-initiated-logout" ), data = {"id_token_hint" : oidc_tokens .id_token }
408
+ reverse ("oauth2_provider:rp-initiated-logout" ),
409
+ data = {"id_token_hint" : oidc_tokens .id_token },
351
410
)
352
411
assert rsp .status_code == 400
353
412
assert is_logged_in (logged_in_client )
@@ -357,7 +416,10 @@ def test_rp_initiated_logout_get_revoked_id_token(logged_in_client, oidc_tokens,
357
416
def test_rp_initiated_logout_get_id_token_redirect (logged_in_client , oidc_tokens , rp_settings ):
358
417
rsp = logged_in_client .get (
359
418
reverse ("oauth2_provider:rp-initiated-logout" ),
360
- data = {"id_token_hint" : oidc_tokens .id_token , "post_logout_redirect_uri" : "http://example.org" },
419
+ data = {
420
+ "id_token_hint" : oidc_tokens .id_token ,
421
+ "post_logout_redirect_uri" : "http://example.org" ,
422
+ },
361
423
)
362
424
assert rsp .status_code == 302
363
425
assert rsp ["Location" ] == "http://example.org"
@@ -385,7 +447,10 @@ def test_rp_initiated_logout_get_id_token_missmatch_client_id(
385
447
):
386
448
rsp = logged_in_client .get (
387
449
reverse ("oauth2_provider:rp-initiated-logout" ),
388
- data = {"id_token_hint" : oidc_tokens .id_token , "client_id" : public_application .client_id },
450
+ data = {
451
+ "id_token_hint" : oidc_tokens .id_token ,
452
+ "client_id" : public_application .client_id ,
453
+ },
389
454
)
390
455
assert rsp .status_code == 400
391
456
assert is_logged_in (logged_in_client )
@@ -427,7 +492,8 @@ def test_rp_initiated_logout_public_client_strict_redirect_client_id(
427
492
@pytest .mark .django_db (databases = retrieve_current_databases ())
428
493
def test_rp_initiated_logout_get_client_id (logged_in_client , oidc_tokens , rp_settings ):
429
494
rsp = logged_in_client .get (
430
- reverse ("oauth2_provider:rp-initiated-logout" ), data = {"client_id" : oidc_tokens .application .client_id }
495
+ reverse ("oauth2_provider:rp-initiated-logout" ),
496
+ data = {"client_id" : oidc_tokens .application .client_id },
431
497
)
432
498
assert rsp .status_code == 200
433
499
assert is_logged_in (logged_in_client )
0 commit comments