Skip to content

Commit 671698b

Browse files
committed
Fixed refactoring of the construction of request object.
1 parent 7d92f58 commit 671698b

File tree

10 files changed

+29
-115
lines changed

10 files changed

+29
-115
lines changed

src/idpyoidc/client/oauth2/add_on/jar.py

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
11
import logging
22
from typing import Optional
33

4-
from idpyoidc import claims
54
from idpyoidc import metadata
6-
from idpyoidc.client.oidc.utils import construct_request_uri
7-
from idpyoidc.client.oidc.utils import request_object_encryption
85
from idpyoidc.client.request_object import construct_request_parameter
9-
from idpyoidc.message.oidc import make_openid_request
10-
from idpyoidc.time_util import utc_time_sans_frac
6+
from idpyoidc.client.request_object import construct_request_uri
117

128
logger = logging.getLogger(__name__)
139

@@ -36,7 +32,6 @@ def store_request_on_file(service, req, **kwargs):
3632
return _webname
3733

3834

39-
4035
def jar_post_construct(request_args, service, **kwargs):
4136
"""
4237
Modify the request arguments.
@@ -89,14 +84,14 @@ def jar_post_construct(request_args, service, **kwargs):
8984

9085

9186
def add_support(
92-
service,
93-
request_type: Optional[str] = "request_parameter",
94-
request_dir: Optional[str] = "",
95-
request_object_signing_alg: Optional[str] = "RS256",
96-
expires_in: Optional[int] = DEFAULT_EXPIRES_IN,
97-
with_jti: Optional[bool] = False,
98-
request_object_encryption_alg: Optional[str] = "",
99-
request_object_encryption_enc: Optional[str] = "",
87+
service,
88+
request_type: Optional[str] = "request_parameter",
89+
request_dir: Optional[str] = "",
90+
request_object_signing_alg: Optional[str] = "RS256",
91+
expires_in: Optional[int] = DEFAULT_EXPIRES_IN,
92+
with_jti: Optional[bool] = False,
93+
request_object_encryption_alg: Optional[str] = "",
94+
request_object_encryption_enc: Optional[str] = "",
10095
):
10196
"""
10297
JAR support can only be considered if this client can access an authorization service.

src/idpyoidc/client/oidc/authorization.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
from idpyoidc.client.oauth2 import authorization
88
from idpyoidc.client.oauth2.utils import pre_construct_pick_redirect_uri
99
from idpyoidc.client.oidc import IDT2REG
10-
from idpyoidc.client.oidc.utils import construct_request_uri
1110
from idpyoidc.client.request_object import construct_request_parameter
11+
from idpyoidc.client.request_object import construct_request_uri
1212
from idpyoidc.client.service_context import ServiceContext
1313
from idpyoidc.client.util import implicit_response_types
1414
from idpyoidc.exception import MissingRequiredAttribute

src/idpyoidc/client/oidc/utils.py

Lines changed: 0 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -1,85 +0,0 @@
1-
import os
2-
3-
from cryptojwt.jwe.jwe import JWE
4-
from cryptojwt.jwe.utils import alg2keytype
5-
6-
from idpyoidc.exception import MissingRequiredAttribute
7-
from idpyoidc.util import rndstr
8-
9-
10-
def request_object_encryption(msg, service_context, keyjar, **kwargs):
11-
"""
12-
Created an encrypted JSON Web token with *msg* as body.
13-
14-
:param msg: The mesaqg
15-
:param service_context:
16-
:param kwargs:
17-
:return:
18-
"""
19-
try:
20-
encalg = kwargs["request_object_encryption_alg"]
21-
except KeyError:
22-
try:
23-
encalg = service_context.get_usage("request_object_encryption_alg")
24-
except KeyError:
25-
return msg
26-
27-
if not encalg:
28-
return msg
29-
30-
try:
31-
encenc = kwargs["request_object_encryption_enc"]
32-
except KeyError:
33-
try:
34-
encenc = service_context.get_usage("request_object_encryption_enc")
35-
except KeyError:
36-
raise MissingRequiredAttribute("No request_object_encryption_enc specified")
37-
38-
if not encenc:
39-
raise MissingRequiredAttribute("No request_object_encryption_enc specified")
40-
41-
_jwe = JWE(msg, alg=encalg, enc=encenc)
42-
_kty = alg2keytype(encalg)
43-
44-
try:
45-
_kid = kwargs["enc_kid"]
46-
except KeyError:
47-
_kid = ""
48-
49-
_target = kwargs.get("target", kwargs.get("recv", None))
50-
if _target is None:
51-
raise MissingRequiredAttribute("No target specified")
52-
53-
if _kid:
54-
_keys = keyjar.get_encrypt_key(_kty, issuer_id=_target, kid=_kid)
55-
_jwe["kid"] = _kid
56-
else:
57-
_keys = keyjar.get_encrypt_key(_kty, issuer_id=_target)
58-
59-
return _jwe.encrypt(_keys)
60-
61-
62-
def construct_request_uri(local_dir, base_path, **kwargs):
63-
"""
64-
Constructs a special redirect_uri to be used when communicating with
65-
one OP. Each OP should get their own redirect_uris.
66-
67-
:param local_dir: Local directory in which to place the file
68-
:param base_path: Base URL to start with
69-
:param kwargs:
70-
:return: 2-tuple with (filename, url)
71-
"""
72-
_filedir = local_dir
73-
if not os.path.isdir(_filedir):
74-
os.makedirs(_filedir)
75-
_webpath = base_path
76-
_name = rndstr(10) + ".jwt"
77-
filename = os.path.join(_filedir, _name)
78-
while os.path.exists(filename):
79-
_name = rndstr(10)
80-
filename = os.path.join(_filedir, _name)
81-
if _webpath.endswith("/"):
82-
_webname = f"{_webpath}{_name}"
83-
else:
84-
_webname = f"{_webpath}/{_name}"
85-
return filename, _webname

src/idpyoidc/client/request_object.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ def request_object_encryption(msg, service_context, keyjar, **kwargs):
1515
"""
1616
Created an encrypted JSON Web token with *msg* as body.
1717
18-
:param msg: The mesaqg
18+
:param msg: The message
1919
:param service_context:
2020
:param kwargs:
2121
:return:
@@ -124,7 +124,10 @@ def construct_request_parameter(service, req, audience=None, **kwargs):
124124
if _issuer is None:
125125
kwargs["issuer"] = _context.get_client_id()
126126

127-
if kwargs.get("recv") is None:
127+
# The receiver
128+
if audience:
129+
kwargs["recv"] = audience
130+
elif kwargs.get("recv") is None:
128131
try:
129132
kwargs["recv"] = _context.provider_info["issuer"]
130133
except KeyError:
@@ -140,10 +143,12 @@ def construct_request_parameter(service, req, audience=None, **kwargs):
140143

141144
kwargs["with_jti"] = kwargs.get("with_jti",True)
142145

143-
# _enc_enc = _jar_conf.get("request_object_encryption_enc", "")
144-
# if _enc_enc:
145-
# kwargs["request_object_encryption_enc"] = _enc_enc
146-
# kwargs["request_object_encryption_alg"] = _jar_conf.get("request_object_encryption_alg")
146+
_enc_enc = kwargs.get("request_object_encryption_enc", "")
147+
if not _enc_enc:
148+
_enc_enc = _context.get_usage("request_object_encryption_enc")
149+
if _enc_enc:
150+
kwargs["request_object_encryption_enc"] = _enc_enc
151+
kwargs["request_object_encryption_alg"] = _context.get_usage("request_object_encryption_alg")
147152

148153
# Filter out only the arguments I want
149154
_mor_args = {
@@ -159,9 +164,6 @@ def construct_request_parameter(service, req, audience=None, **kwargs):
159164
if k in kwargs
160165
}
161166

162-
if audience:
163-
_mor_args["aud"] = audience
164-
165167
_req_jwt = make_openid_request(req, **_mor_args)
166168

167169
if "target" not in kwargs:

src/idpyoidc/message/oidc/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1182,7 +1182,7 @@ def make_openid_request(
11821182
:param request_object_signing_alg: Which signing algorithm to use
11831183
:param recv: The intended receiver of the request
11841184
:param with_jti: Whether a JTI should be included in the JWT.
1185-
:param lifetime: How long the JWT is expect to be live.
1185+
:param lifetime: How long the JWT is expected to be alive.
11861186
:return: JWT encoded OpenID request
11871187
"""
11881188

tests/private/token_jwks.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"keys": [{"kty": "oct", "use": "enc", "kid": "code", "k": "vSHDkLBHhDStkR0NWu8519rmV5zmnm5_"}, {"kty": "oct", "use": "enc", "kid": "refresh", "k": "etMvKWMjiDg3OSf1P_eXtue8iDOxUGqp"}]}
1+
{"keys": [{"kty": "oct", "use": "enc", "kid": "code", "k": "vSHDkLBHhDStkR0NWu8519rmV5zmnm5_"}, {"kty": "oct", "use": "enc", "kid": "refresh", "k": "iIetL7Smy3aIAy38ENGPqMaufuxvV0GI"}]}

tests/pub_client.jwks

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"keys": [{"kty": "EC", "use": "sig", "kid": "azZQQ2FEQjh3QnVZWVdrbHJkMEZSaWR6aVJ0LTBjeUFfeWRlbTRrRFZ5VQ", "crv": "P-256", "x": "2ADe18caWWGp6hpRbfa9HqQHDFNpid9xUmR56Wzm_wc", "y": "HnD_8QBanz4Y-UF8mKQFZXfqkGkXUSm34mLsdDKtSyk"}, {"kty": "RSA", "use": "sig", "kid": "SHEyYWcwNVk0LTdROTZzZ2FUWndIVXdack0xWUM5SEpwcS03dVUxWU4zRQ", "n": "rRz52ddyP9Y2ezSlRsnkt-sjXfV_Ii7vOFX-cStLE3IUlVeSJGEe_kAASLr2r3BE2unjntaxj67NP8D95h_rzG1SpCklTEn-aTe3FOwNyTzUH_oiDVeRoEcf04Y43ciRGYRB5PhI6ii-2lYuig6hyUr776Qxiu6-0zw-M_ay2MgGSy5CEj55dDSvcUyxStUObxGpPWnEvybO1vnE7iJEWGNe0L5uPe5nLidOiR-JwjxSWEx1xZYtIjxaf2Ulu-qu4hwgwBUQdx4bNZyBfljKj55skWuHqPMG3xMjnedQC6Ms5bR3rIkbBpvmgI3kJK-4CZikM6ruyLo94-Lk19aYQw", "e": "AQAB"}]}
1+
{"keys": [{"kty": "EC", "use": "sig", "kid": "azZQQ2FEQjh3QnVZWVdrbHJkMEZSaWR6aVJ0LTBjeUFfeWRlbTRrRFZ5VQ", "crv": "P-256", "x": "2ADe18caWWGp6hpRbfa9HqQHDFNpid9xUmR56Wzm_wc", "y": "HnD_8QBanz4Y-UF8mKQFZXfqkGkXUSm34mLsdDKtSyk"}, {"kty": "RSA", "use": "sig", "kid": "SHEyYWcwNVk0LTdROTZzZ2FUWndIVXdack0xWUM5SEpwcS03dVUxWU4zRQ", "e": "AQAB", "n": "rRz52ddyP9Y2ezSlRsnkt-sjXfV_Ii7vOFX-cStLE3IUlVeSJGEe_kAASLr2r3BE2unjntaxj67NP8D95h_rzG1SpCklTEn-aTe3FOwNyTzUH_oiDVeRoEcf04Y43ciRGYRB5PhI6ii-2lYuig6hyUr776Qxiu6-0zw-M_ay2MgGSy5CEj55dDSvcUyxStUObxGpPWnEvybO1vnE7iJEWGNe0L5uPe5nLidOiR-JwjxSWEx1xZYtIjxaf2Ulu-qu4hwgwBUQdx4bNZyBfljKj55skWuHqPMG3xMjnedQC6Ms5bR3rIkbBpvmgI3kJK-4CZikM6ruyLo94-Lk19aYQw"}]}

tests/pub_iss.jwks

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"keys": [{"kty": "EC", "use": "sig", "kid": "SmdKMlVGcG1zMnprdDdXZGpGWEczdHhlZVpGbkx1THpPdUY4d0w4bnZkSQ", "crv": "P-256", "x": "tRHJYm0fsOi0icpGEb33qiDVgt68ltMoYSWdLGhDGz4", "y": "fRpX0i6p5Jigf5I0qwW34PyStosMShwWAWS8x_w5o7E"}, {"kty": "RSA", "use": "sig", "kid": "R0FsaFdqREFaUFp1c0MwbUpsbHVSZ200blBJZWJVMTUtNGsyVlBmdHk5UQ", "n": "2ilgsKVqF92KfhwmosSVeZOaDgb3RF1mbg-pqkmLO6YpOO06LF4V4angF-GhP-ysAm2E75aSIU4tnHVThFlcxTgKFqjYKJQXyVzTVK2r-L2IbvFPaDtvoU6WteybpMlIUVk2po3cFDGObCWYKCm7CUOLlwH0uOpui66P9VSCqdKVKbJRAQBvTSbP10KWPxulfqjWGJtHO5fY7-JVWwOBkG-eHSJIT_uaoPjyvKCZjknq04bLUV9qP78KRQpRyYijBN60w2v8F79baN9CN10TIEjjWKGz0uX0M_YYQzTUoSY5l5ka9RkL3wT4o2iQ1t5nHphX6aA-gqwgCQmi-nvjaw", "e": "AQAB"}]}
1+
{"keys": [{"kty": "EC", "use": "sig", "kid": "SmdKMlVGcG1zMnprdDdXZGpGWEczdHhlZVpGbkx1THpPdUY4d0w4bnZkSQ", "crv": "P-256", "x": "tRHJYm0fsOi0icpGEb33qiDVgt68ltMoYSWdLGhDGz4", "y": "fRpX0i6p5Jigf5I0qwW34PyStosMShwWAWS8x_w5o7E"}, {"kty": "RSA", "use": "sig", "kid": "R0FsaFdqREFaUFp1c0MwbUpsbHVSZ200blBJZWJVMTUtNGsyVlBmdHk5UQ", "e": "AQAB", "n": "2ilgsKVqF92KfhwmosSVeZOaDgb3RF1mbg-pqkmLO6YpOO06LF4V4angF-GhP-ysAm2E75aSIU4tnHVThFlcxTgKFqjYKJQXyVzTVK2r-L2IbvFPaDtvoU6WteybpMlIUVk2po3cFDGObCWYKCm7CUOLlwH0uOpui66P9VSCqdKVKbJRAQBvTSbP10KWPxulfqjWGJtHO5fY7-JVWwOBkG-eHSJIT_uaoPjyvKCZjknq04bLUV9qP78KRQpRyYijBN60w2v8F79baN9CN10TIEjjWKGz0uX0M_YYQzTUoSY5l5ka9RkL3wT4o2iQ1t5nHphX6aA-gqwgCQmi-nvjaw"}]}

tests/test_client_21_oidc_service.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,8 @@ def test_request_init_request_method(self):
213213
"iss",
214214
"aud",
215215
"iat",
216+
"jti",
217+
"exp"
216218
}
217219

218220
def test_request_param(self):

tests/test_client_24_oic_utils.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
from cryptojwt.jwe.jwe import factory
22
from cryptojwt.key_jar import build_keyjar
33

4-
from idpyoidc.client.oidc.utils import construct_request_uri
5-
from idpyoidc.client.oidc.utils import request_object_encryption
4+
from idpyoidc.client.request_object import construct_request_uri
5+
from idpyoidc.client.request_object import request_object_encryption
66
from idpyoidc.client.service_context import ServiceContext
77
from idpyoidc.message.oidc import AuthorizationRequest
88

0 commit comments

Comments
 (0)