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

Commit f1d07ec

Browse files
committed
Separate services from add-ons to services.
1 parent a5ba9ef commit f1d07ec

File tree

9 files changed

+46
-191
lines changed

9 files changed

+46
-191
lines changed

src/oidcservice/oidc/add_on/__init__.py

Whitespace-only changes.
Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
from cryptojwt.utils import b64e
22
from oidcmsg.message import Message
33

4-
from oidcservice import unreserved, CC_METHOD
4+
from oidcservice import CC_METHOD
5+
from oidcservice import unreserved
56
from oidcservice.exception import Unsupported
67
from oidcservice.oauth2.utils import get_state_parameter
78

@@ -42,12 +43,12 @@ def add_code_challenge(request_args, service, **kwargs):
4243
raise Unsupported(
4344
'PKCE Transformation method:{}'.format(_method))
4445

45-
_item = Message(code_verifier=code_verifier,code_challenge_method=_method)
46+
_item = Message(code_verifier=code_verifier, code_challenge_method=_method)
4647
service.store_item(_item, 'pkce', request_args['state'])
4748

4849
request_args.update({"code_challenge": code_challenge,
4950
"code_challenge_method": _method})
50-
return request_args
51+
return request_args, {}
5152

5253

5354
def add_code_verifier(request_args, service, **kwargs):
@@ -68,3 +69,24 @@ def add_code_verifier(request_args, service, **kwargs):
6869
def put_state_in_post_args(request_args, **kwargs):
6970
state = get_state_parameter(request_args, kwargs)
7071
return request_args, {'state': state}
72+
73+
74+
def add_pkce_support(service, code_challenge_length, code_challenge_method):
75+
"""
76+
77+
:param service: Dictionary of services
78+
:param code_challenge_length:
79+
:param code_challenge_method:
80+
:return:
81+
"""
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)

src/oidcservice/oidc/service.py.old

Lines changed: 0 additions & 111 deletions
This file was deleted.

src/oidcservice/service.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ def get_request_parameters(self, request_args=None, method="",
310310
request_body_type = self.request_body_type
311311

312312
request = self.construct_request(request_args=request_args, **kwargs)
313-
LOGGER.debug("Request: %s", request.to_dict())
313+
LOGGER.debug("Request: ", request)
314314
_info = {'method': method}
315315

316316
_args = kwargs.copy()

src/oidcservice/service_context.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ def __init__(self, keyjar=None, config=None, **kwargs):
8686
self.issuer = ''
8787
self.redirect_uris = []
8888
self.callback = None
89+
self.args = {}
8990

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

tests/request123456.jwt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
eyJhbGciOiJSUzI1NiIsImtpZCI6ImFWODBkazlpZG1sbU1YVlBkMUJYV2xGcGIwZFdZVnBHYkRkVVYxSlFWWGRoV0cxVU9HeFNaRkZCYXcifQ.eyJyZXNwb25zZV90eXBlIjogImNvZGUiLCAic3RhdGUiOiAic3RhdGUiLCAicmVkaXJlY3RfdXJpIjogImh0dHBzOi8vZXhhbXBsZS5jb20vY2xpL2F1dGh6X2NiIiwgInNjb3BlIjogIm9wZW5pZCIsICJub25jZSI6ICI1enczbFA2bmxicmp1MHdBamZEaE1adGE3V0FPTkJhNSIsICJjbGllbnRfaWQiOiAiY2xpZW50X2lkIiwgImlzcyI6ICJjbGllbnRfaWQiLCAiaWF0IjogMTU0NzY2NTY2OCwgImF1ZCI6IFsiaHR0cHM6Ly9leGFtcGxlLmNvbSJdLCAia2lkIjogImFWODBkazlpZG1sbU1YVlBkMUJYV2xGcGIwZFdZVnBHYkRkVVYxSlFWWGRoV0cxVU9HeFNaRkZCYXcifQ.UZ58mw35enn2cjSmEoe34EDs9mnrVqgK3T1mKp945frz6J3INFRwlu9h4PR45GEi4ebbeY6EZmb8zeCBS_EfoJI37k_JLma7sxOqsF8viVO_MGQGLo2ygrU-UyKnFpKldg5rPI5SAcYQElufT3jv0vqx-o3HQ5p-usuZNMMatvle_IWckHbWAACZ81oy2PDvp_nTwma5UH_giQQA1mSYcmgo2YxluszPJa0FLEw4Uy8-yMVnWkIlodeF9inrMrSSePpwfl5t0gNxxOY4PN84t6VsXLcfp6Jfq4xpFkfPIJNuRc5iY3NX2-tsRF6TuUrhl0PFELdIombkCcUEDLWJdQ
1+
eyJhbGciOiJSUzI1NiIsImtpZCI6ImFWODBkazlpZG1sbU1YVlBkMUJYV2xGcGIwZFdZVnBHYkRkVVYxSlFWWGRoV0cxVU9HeFNaRkZCYXcifQ.eyJyZXNwb25zZV90eXBlIjogImNvZGUiLCAic3RhdGUiOiAic3RhdGUiLCAicmVkaXJlY3RfdXJpIjogImh0dHBzOi8vZXhhbXBsZS5jb20vY2xpL2F1dGh6X2NiIiwgInNjb3BlIjogIm9wZW5pZCIsICJub25jZSI6ICJheE1QSlByalVacFdERkxUSVYxVVE3Q2RCMzVseHpOcCIsICJjbGllbnRfaWQiOiAiY2xpZW50X2lkIiwgImlzcyI6ICJjbGllbnRfaWQiLCAiaWF0IjogMTU3NDAwNTE2MiwgImF1ZCI6IFsiaHR0cHM6Ly9leGFtcGxlLmNvbSJdfQ.bohgxuuW6EslKVZk_do68TCjx7JMybcvcTFD5MYxFDi2zc0nsMO62uE1eoN_8fd7eprV9G7PJF69lRBOEpszROMsK-nOq7GM1Q8DJIabPF99SF3hKVPNPyPF5ipRLIESG0_I4KB1dY41dOnd5rSeHMLwdNiN5iakjqoeK_LpX0J0DlaCp8RZeMubN6EB1KXHXi6RpWbtprZbvtQha0dCsQ4xfXJTt61CkPH1VEV-8W2orWvmX9fFIznF0Zt06HIinK8EO1_xg88kKmg3JtMrJ9cq8RweM8G2g5xcdRvFrFcVlnBSZwWuDM01oUlowOM20X-9FeQ--I6L2r-8NPUOrw

tests/test_13_oic_service.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,8 +162,7 @@ def test_request_init_request_method(self):
162162
owner='client_id'))
163163
assert _resp
164164
assert set(_resp.keys()) == {'response_type', 'client_id', 'scope',
165-
'redirect_uri', 'state', 'nonce',
166-
'iss', 'aud', 'kid', 'iat'}
165+
'redirect_uri', 'state', 'nonce', 'iss', 'aud', 'iat'}
167166

168167
def test_request_param(self):
169168
req_args = {'response_type': 'code', 'state': 'state'}

tests/test_14_pkce.py

Lines changed: 16 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22
from oidcmsg.message import SINGLE_REQUIRED_STRING
33
from oidcmsg.oidc import AuthorizationResponse
44

5-
from oidcservice.oidc.pkce import add_code_challenge
6-
from oidcservice.oidc.pkce import add_code_verifier
7-
from oidcservice.oidc.pkce import put_state_in_post_args
5+
from oidcservice.oidc.add_on.pkce import add_code_challenge
6+
from oidcservice.oidc.add_on.pkce import add_code_verifier
7+
from oidcservice.oidc.add_on.pkce import add_pkce_support
8+
from oidcservice.oidc.add_on.pkce import put_state_in_post_args
89
from oidcservice.service import Service
910
from oidcservice.service import init_services
1011
from oidcservice.service_context import ServiceContext
@@ -36,12 +37,12 @@ def test_add_code_challenge_default_values():
3637
service = DummyService(service_context, state_db=InMemoryStateDataBase())
3738
_state = State(iss='Issuer')
3839
service.state_db.set('state', _state.to_json())
39-
spec = add_code_challenge({'state': 'state'}, service)
40+
request_args, _ = add_code_challenge({'state': 'state'}, service)
4041

4142
# default values are length:64 method:S256
42-
assert set(spec.keys()) == {'code_challenge', 'code_challenge_method',
43+
assert set(request_args.keys()) == {'code_challenge', 'code_challenge_method',
4344
'state'}
44-
assert spec['code_challenge_method'] == 'S256'
45+
assert request_args['code_challenge_method'] == 'S256'
4546

4647
request_args = add_code_verifier({}, service, state='state')
4748
assert len(request_args['code_verifier']) == 64
@@ -61,10 +62,10 @@ def test_add_code_challenge_spec_values():
6162
_state = State(iss='Issuer')
6263
service.state_db.set('state', _state.to_json())
6364

64-
spec = add_code_challenge({'state': 'state'}, service)
65-
assert set(spec.keys()) == {'code_challenge', 'code_challenge_method',
65+
request_args, _ = add_code_challenge({'state': 'state'}, service)
66+
assert set(request_args.keys()) == {'code_challenge', 'code_challenge_method',
6667
'state'}
67-
assert spec['code_challenge_method'] == 'S384'
68+
assert request_args['code_challenge_method'] == 'S384'
6869

6970
request_args = add_code_verifier({}, service, state='state')
7071
assert len(request_args['code_verifier']) == 128
@@ -82,7 +83,7 @@ def test_authorization_and_pkce():
8283
state_db=InMemoryStateDataBase(),
8384
service_context=service_context)
8485
service.post_construct.append(add_code_challenge)
85-
request = service.construct_request()
86+
request, _ = service.construct_request()
8687
assert set(request.keys()) == {'client_id', 'code_challenge',
8788
'code_challenge_method', 'state', 'nonce',
8889
'redirect_uri', 'response_type', 'scope'}
@@ -102,7 +103,7 @@ def test_access_token_and_pkce():
102103
authz_service = service_factory('Authorization', ['oidc'], state_db=db,
103104
service_context=service_context)
104105
authz_service.post_construct.append(add_code_challenge)
105-
request = authz_service.construct_request()
106+
request, _ = authz_service.construct_request()
106107
_state = request['state']
107108

108109
auth_response = AuthorizationResponse(code='access code')
@@ -134,28 +135,17 @@ def test_pkce_config():
134135
service_definitions = {
135136
'authorization': {
136137
'class': 'oidcservice.oidc.authorization.Authorization',
137-
'kwargs': {},
138-
'post_functions': [
139-
{
140-
'function': 'oidcservice.oidc.pkce.add_code_challenge'
141-
}
142-
]
138+
'kwargs': {}
143139
},
144140
'access_token': {
145141
'class': 'oidcservice.oidc.access_token.AccessToken',
146-
'kwargs': {},
147-
'pre_functions': [
148-
{
149-
'function': 'oidcservice.oidc.pkce.put_state_in_post_args'
150-
}
151-
],
152-
'post_functions': [
153-
{'function': 'oidcservice.oidc.pkce.add_code_verifier'}
154-
]
142+
'kwargs': {}
155143
}
156144
}
157145
service = init_services(service_definitions, service_context, db)
158146

147+
add_pkce_support(service, 64, 'S256')
148+
159149
request = service['authorization'].construct_request()
160150
_state = request['state']
161151

@@ -166,49 +156,3 @@ def test_pkce_config():
166156
assert set(request.keys()) == {'client_id', 'redirect_uri', 'grant_type',
167157
'client_secret', 'code_verifier', 'code',
168158
'state'}
169-
170-
# class TestPKCE(object):
171-
# def test_pkce_create(self):
172-
# _cli = Client(
173-
# config={'code_challenge': {'method': 'S256', 'length': 64}})
174-
# args, cv = _cli.add_code_challenge()
175-
# assert args['code_challenge_method'] == 'S256'
176-
# assert _eq(list(args.keys()),
177-
# ['code_challenge_method', 'code_challenge'])
178-
#
179-
# def test_pkce_verify_256(self, session_db_factory):
180-
# _cli = Client(
181-
# config={'code_challenge': {'method': 'S256', 'length': 64}})
182-
# args, cv = _cli.add_code_challenge()
183-
#
184-
# authn_broker = AuthnBroker()
185-
# authn_broker.add("UNDEFINED", DummyAuthn(None, "username"))
186-
# _prov = Provider("as",
187-
# session_db_factory('https://connect-op.heroku.com'),
188-
# {},
189-
# authn_broker, Implicit(), verify_client)
190-
#
191-
# assert _prov.verify_code_challenge(cv, args['code_challenge']) is True
192-
# assert _prov.verify_code_challenge(cv, args['code_challenge'],
193-
# 'S256') is True
194-
# resp = _prov.verify_code_challenge('XXX', args['code_challenge'])
195-
# assert isinstance(resp, Response)
196-
# assert resp.info()['status_code'] == 401
197-
#
198-
# def test_pkce_verify_512(self, session_db_factory):
199-
# _cli = Client(
200-
# config={'code_challenge': {'method': 'S512', 'length': 96}})
201-
# args, cv = _cli.add_code_challenge()
202-
#
203-
# authn_broker = AuthnBroker()
204-
# authn_broker.add("UNDEFINED", DummyAuthn(None, "username"))
205-
# _prov = Provider("as",
206-
# session_db_factory('https://connect-op.heroku.com'),
207-
# {},
208-
# authn_broker, Implicit(), verify_client)
209-
#
210-
# assert _prov.verify_code_challenge(cv, args['code_challenge'],
211-
# 'S512') is True
212-
# resp = _prov.verify_code_challenge('XXX', args['code_challenge'])
213-
# assert isinstance(resp, Response)
214-
# assert resp.info()['status_code'] == 401

tests/test_20_conversation.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,7 @@ def test_conversation():
396396

397397
assert isinstance(_resp, AccessTokenResponse)
398398
assert set(_resp['__verified_id_token'].keys()) == {
399-
'iss', 'kid', 'nonce', 'acr', 'auth_time', 'aud', 'iat', 'exp', 'sub'}
399+
'iss', 'nonce', 'acr', 'auth_time', 'aud', 'iat', 'exp', 'sub'}
400400

401401
service['accesstoken'].update_service_context(_resp, key=STATE)
402402

0 commit comments

Comments
 (0)