Skip to content
This repository was archived by the owner on Jun 12, 2021. It is now read-only.

Commit e3509b5

Browse files
committed
Fixed PKCE support.
1 parent a77af6c commit e3509b5

File tree

6 files changed

+164
-150
lines changed

6 files changed

+164
-150
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from oidcservice.util import importer
2+
3+
4+
def do_add_ons(add_ons, services):
5+
for key, spec in add_ons.items():
6+
_func = importer(spec['function'])
7+
_func(services, **spec['kwargs'])

src/oidcservice/oidc/add_on/pkce.py

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import logging
2+
13
from cryptojwt.utils import b64e
24
from oidcmsg.message import Message
35

@@ -6,6 +8,8 @@
68
from oidcservice.exception import Unsupported
79
from oidcservice.oauth2.utils import get_state_parameter
810

11+
logger = logging.getLogger(__name__)
12+
913

1014
def 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

7483
def 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")

src/oidcservice/oidc/utils.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,11 +67,11 @@ def construct_request_uri(local_dir, base_path, **kwargs):
6767
"""
6868
Constructs a special redirect_uri to be used when communicating with
6969
one OP. Each OP should get their own redirect_uris.
70-
70+
7171
:param local_dir: Local directory in which to place the file
7272
:param base_path: Base URL to start with
73-
:param kwargs:
74-
:return: 2-tuple with (filename, url)
73+
:param kwargs:
74+
:return: 2-tuple with (filename, url)
7575
"""
7676
_filedir = local_dir
7777
if not os.path.isdir(_filedir):

src/oidcservice/service.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ def construct_request(self, request_args=None, **kwargs):
228228
The request information is gathered and the where and how of sending the
229229
request is decided.
230230
231-
:param request_args: Initial request arguments
231+
:param request_args: Initial request arguments as a dictionary
232232
:param kwargs: Extra keyword arguments
233233
:return: A dictionary with the keys 'url' and possibly 'body', 'kwargs',
234234
'request' and 'ht_args'.

src/oidcservice/service_context.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ def __init__(self, keyjar=None, config=None, **kwargs):
8787
self.redirect_uris = []
8888
self.callback = None
8989
self.args = {}
90+
self.add_on = {}
9091

9192
try:
9293
self.clock_skew = config['clock_skew']

0 commit comments

Comments
 (0)