1
+ import logging
2
+
1
3
from cryptojwt .utils import b64e
2
4
from oidcmsg .message import Message
3
5
6
8
from oidcservice .exception import Unsupported
7
9
from oidcservice .oauth2 .utils import get_state_parameter
8
10
11
+ logger = logging .getLogger (__name__ )
12
+
9
13
10
14
def add_code_challenge (request_args , service , ** kwargs ):
11
15
"""
@@ -18,8 +22,10 @@ def add_code_challenge(request_args, service, **kwargs):
18
22
:param kwargs: Extra set of keyword arguments
19
23
:return: Updated set of request arguments
20
24
"""
25
+ _kwargs = service .service_context .add_on ["pkce" ]
26
+
21
27
try :
22
- cv_len = service . service_context . config [ 'code_challenge' ][ 'length ' ]
28
+ cv_len = _kwargs [ 'code_challenge_length ' ]
23
29
except KeyError :
24
30
cv_len = 64 # Use default
25
31
@@ -28,7 +34,7 @@ def add_code_challenge(request_args, service, **kwargs):
28
34
_cv = code_verifier .encode ()
29
35
30
36
try :
31
- _method = service . service_context . config [ 'code_challenge' ][ 'method ' ]
37
+ _method = _kwargs [ 'code_challenge_method ' ]
32
38
except KeyError :
33
39
_method = 'S256'
34
40
@@ -46,8 +52,11 @@ def add_code_challenge(request_args, service, **kwargs):
46
52
_item = Message (code_verifier = code_verifier , code_challenge_method = _method )
47
53
service .store_item (_item , 'pkce' , request_args ['state' ])
48
54
49
- request_args .update ({"code_challenge" : code_challenge ,
50
- "code_challenge_method" : _method })
55
+ request_args .update (
56
+ {
57
+ "code_challenge" : code_challenge ,
58
+ "code_challenge_method" : _method
59
+ })
51
60
return request_args , {}
52
61
53
62
@@ -73,20 +82,25 @@ def put_state_in_post_args(request_args, **kwargs):
73
82
74
83
def add_pkce_support (service , code_challenge_length , code_challenge_method ):
75
84
"""
85
+ PKCE support can only be considered if this client can access authorization and
86
+ access token services.
76
87
77
88
:param service: Dictionary of services
78
89
:param code_challenge_length:
79
90
:param code_challenge_method:
80
91
:return:
81
92
"""
82
- authn_service = service ["authorization" ]
83
- authn_service .service_context .args ['pkce' ] = {
84
- "code_challenge_length" : code_challenge_length ,
85
- "code_challenge_method" : code_challenge_method
86
- }
87
-
88
- authn_service .pre_construct .append (add_code_challenge )
89
-
90
- token_service = service ['accesstoken' ]
91
- token_service .pre_construct .append (put_state_in_post_args )
92
- token_service .post_construct .append (add_code_verifier )
93
+ if "authorization" in service and "accesstoken" in service :
94
+ _service = service ["authorization" ]
95
+ _service .service_context .add_on ['pkce' ] = {
96
+ "code_challenge_length" : code_challenge_length ,
97
+ "code_challenge_method" : code_challenge_method
98
+ }
99
+
100
+ _service .pre_construct .append (add_code_challenge )
101
+
102
+ token_service = service ['accesstoken' ]
103
+ token_service .pre_construct .append (put_state_in_post_args )
104
+ token_service .post_construct .append (add_code_verifier )
105
+ else :
106
+ logger .warning ("PKCE support could NOT be added" )
0 commit comments