1+ import logging
2+
13from cryptojwt .utils import b64e
24from oidcmsg .message import Message
35
68from oidcservice .exception import Unsupported
79from oidcservice .oauth2 .utils import get_state_parameter
810
11+ logger = logging .getLogger (__name__ )
12+
913
1014def add_code_challenge (request_args , service , ** kwargs ):
1115 """
@@ -18,8 +22,10 @@ def add_code_challenge(request_args, service, **kwargs):
1822 :param kwargs: Extra set of keyword arguments
1923 :return: Updated set of request arguments
2024 """
25+ _kwargs = service .service_context .add_on ["pkce" ]
26+
2127 try :
22- cv_len = service . service_context . config [ 'code_challenge' ][ 'length ' ]
28+ cv_len = _kwargs [ 'code_challenge_length ' ]
2329 except KeyError :
2430 cv_len = 64 # Use default
2531
@@ -28,7 +34,7 @@ def add_code_challenge(request_args, service, **kwargs):
2834 _cv = code_verifier .encode ()
2935
3036 try :
31- _method = service . service_context . config [ 'code_challenge' ][ 'method ' ]
37+ _method = _kwargs [ 'code_challenge_method ' ]
3238 except KeyError :
3339 _method = 'S256'
3440
@@ -46,8 +52,11 @@ def add_code_challenge(request_args, service, **kwargs):
4652 _item = Message (code_verifier = code_verifier , code_challenge_method = _method )
4753 service .store_item (_item , 'pkce' , request_args ['state' ])
4854
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+ })
5160 return request_args , {}
5261
5362
@@ -73,20 +82,25 @@ def put_state_in_post_args(request_args, **kwargs):
7382
7483def add_pkce_support (service , code_challenge_length , code_challenge_method ):
7584 """
85+ PKCE support can only be considered if this client can access authorization and
86+ access token services.
7687
7788 :param service: Dictionary of services
7889 :param code_challenge_length:
7990 :param code_challenge_method:
8091 :return:
8192 """
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