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

Commit 7bbde28

Browse files
authored
Merge pull request #117 from nsklikas/feature-jwt-access-lifetime
Fix JWT access token lifetime
2 parents 0be7aa4 + 4c4e1e0 commit 7bbde28

4 files changed

Lines changed: 39 additions & 4 deletions

File tree

src/oidcop/session/grant.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,9 @@ def mint_token(
316316
scope=scope,
317317
extra_payload=handler_args,
318318
)
319-
item.value = token_handler(session_id=session_id, **token_payload)
319+
item.value = token_handler(
320+
session_id=session_id, usage_rules=usage_rules, **token_payload
321+
)
320322

321323
else:
322324
raise ValueError("Can not mint that kind of token")

src/oidcop/token/id_token.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,7 @@ def __call__(
267267
encrypt=False,
268268
code=None,
269269
access_token=None,
270+
usage_rules: Optional[dict] = None,
270271
**kwargs,
271272
) -> str:
272273
_context = self.server_get("endpoint_context")

src/oidcop/token/jwt_token.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,13 @@ def load_custom_claims(self, payload: dict = None):
4848
# inherit me and do your things here
4949
return payload
5050

51-
def __call__(self, session_id: Optional[str] = "", token_class: Optional[str] = "",
52-
**payload) -> str:
51+
def __call__(
52+
self,
53+
session_id: Optional[str] = "",
54+
token_class: Optional[str] = "",
55+
usage_rules: Optional[dict] = None,
56+
**payload
57+
) -> str:
5358

5459
"""
5560
Return a token.
@@ -70,8 +75,15 @@ def __call__(self, session_id: Optional[str] = "", token_class: Optional[str] =
7075

7176
# payload.update(kwargs)
7277
_context = self.server_get("endpoint_context")
78+
if usage_rules and "expires_in" in usage_rules:
79+
lifetime = usage_rules.get("expires_in")
80+
else:
81+
lifetime = self.lifetime
7382
signer = JWT(
74-
key_jar=_context.keyjar, iss=self.issuer, lifetime=self.lifetime, sign_alg=self.alg,
83+
key_jar=_context.keyjar,
84+
iss=self.issuer,
85+
lifetime=lifetime,
86+
sign_alg=self.alg,
7587
)
7688

7789
return signer.pack(payload)

tests/test_35_oidc_token_endpoint.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -816,6 +816,26 @@ def test_configure_grant_types(self):
816816
assert "access_token" in self.token_endpoint.helper
817817
assert "refresh_token" not in self.token_endpoint.helper
818818

819+
def test_access_token_lifetime(self):
820+
lifetime = 100
821+
session_id = self._create_session(AUTH_REQ)
822+
grant = self.session_manager[session_id]
823+
code = self._mint_code(grant, AUTH_REQ["client_id"])
824+
grant.usage_rules["access_token"] = {"expires_in": lifetime}
825+
826+
_token_request = TOKEN_REQ_DICT.copy()
827+
_token_request["code"] = code.value
828+
_req = self.token_endpoint.parse_request(_token_request)
829+
_resp = self.token_endpoint.process_request(request=_req)
830+
831+
access_token = AccessTokenRequest().from_jwt(
832+
_resp["response_args"]["access_token"],
833+
self.endpoint_context.keyjar,
834+
sender="",
835+
)
836+
837+
assert access_token["exp"] - access_token["iat"] == lifetime
838+
819839

820840
class TestOldTokens(object):
821841
@pytest.fixture(autouse=True)

0 commit comments

Comments
 (0)