Skip to content

Commit c9d86fa

Browse files
authored
Merge pull request #18 from ctriant/fix-requested-token-type
Handle missing token exchange requested_token_type parameter
2 parents c2b88e9 + d6e68ef commit c9d86fa

3 files changed

Lines changed: 54 additions & 2 deletions

File tree

src/idpyoidc/server/oauth2/token.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,13 @@ def process_request(self, request: Optional[Union[Message, dict]] = None, **kwar
129129
_context = self.server_get("endpoint_context")
130130

131131
if isinstance(request, TokenExchangeRequest):
132-
_handler_key = TOKEN_TYPES_MAPPING[request["requested_token_type"]]
132+
requested_token_type = request.get(
133+
"requested_token_type",
134+
self.helper["urn:ietf:params:oauth:grant-type:token-exchange"].config[
135+
"default_requested_token_type"
136+
],
137+
)
138+
_handler_key = TOKEN_TYPES_MAPPING[requested_token_type]
133139
else:
134140
_handler_key = "access_token"
135141

src/idpyoidc/server/oauth2/token_helper.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,7 @@ def __init__(self, endpoint, config=None):
392392
"urn:ietf:params:oauth:token-type:access_token",
393393
"urn:ietf:params:oauth:token-type:refresh_token",
394394
],
395+
"default_requested_token_type": "urn:ietf:params:oauth:token-type:access_token",
395396
"policy": {"": {"callable": validate_token_exchange_policy}},
396397
}
397398
else:

tests/test_server_36_oauth2_token_exchange.py

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,52 @@ def _mint_code(self, grant, client_id):
239239
{"refresh_token": "urn:ietf:params:oauth:token-type:refresh_token"},
240240
],
241241
)
242-
def test_token_exchange(self, token):
242+
def test_token_exchange1(self, token):
243+
"""
244+
Test that token exchange requests work correctly with only the required parameters
245+
present
246+
"""
247+
if list(token.keys())[0] == "refresh_token":
248+
AUTH_REQ["scope"] = ["openid", "offline_access"]
249+
areq = AUTH_REQ.copy()
250+
251+
session_id = self._create_session(areq)
252+
grant = self.endpoint_context.authz(session_id, areq)
253+
code = self._mint_code(grant, areq["client_id"])
254+
255+
_token_request = TOKEN_REQ_DICT.copy()
256+
_token_request["code"] = code.value
257+
_req = self.endpoint.parse_request(_token_request)
258+
_resp = self.endpoint.process_request(request=_req)
259+
_token_value = _resp["response_args"][list(token.keys())[0]]
260+
261+
token_exchange_req = TokenExchangeRequest(
262+
grant_type="urn:ietf:params:oauth:grant-type:token-exchange",
263+
subject_token=_token_value,
264+
subject_token_type=token[list(token.keys())[0]]
265+
)
266+
267+
_req = self.endpoint.parse_request(
268+
token_exchange_req.to_urlencoded(),
269+
{"headers": {"authorization": "Basic {}".format("Y2xpZW50XzI6aGVtbGlndA==")}},
270+
)
271+
_resp = self.endpoint.process_request(request=_req)
272+
assert set(_resp["response_args"].keys()) == {
273+
"access_token",
274+
"token_type",
275+
"scope",
276+
"expires_in",
277+
"issued_token_type",
278+
}
279+
280+
@pytest.mark.parametrize(
281+
"token",
282+
[
283+
{"access_token": "urn:ietf:params:oauth:token-type:access_token"},
284+
{"refresh_token": "urn:ietf:params:oauth:token-type:refresh_token"},
285+
],
286+
)
287+
def test_token_exchange2(self, token):
243288
"""
244289
Test that token exchange requests work correctly
245290
"""

0 commit comments

Comments
 (0)