Skip to content

Commit 977323d

Browse files
authored
Merge pull request #113 from lionick/add_lifetime_id_token_upstream
Fix Per-Client Lifetime for id_token
2 parents 42e3b95 + 4325ba9 commit 977323d

File tree

2 files changed

+58
-3
lines changed

2 files changed

+58
-3
lines changed

src/idpyoidc/server/token/id_token.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,10 @@ def __call__(
299299
else:
300300
xargs = {}
301301

302-
lifetime = self.lifetime
302+
if usage_rules and "expires_in" in usage_rules:
303+
lifetime = usage_rules.get("expires_in")
304+
else:
305+
lifetime = self.lifetime
303306

304307
id_token = self.sign_encrypt(
305308
session_id,

tests/test_server_08_id_token.py

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from idpyoidc.message.oidc import AuthorizationRequest
1010
from idpyoidc.server import Server
1111
from idpyoidc.server.authn_event import create_authn_event
12+
from idpyoidc.server.authz import AuthzHandling
1213
from idpyoidc.server.client_authn import verify_client
1314
from idpyoidc.server.token.id_token import get_sign_and_encrypt_algorithms
1415
from idpyoidc.server.user_authn.authn_context import INTERNETPROTOCOLPASSWORD
@@ -179,7 +180,7 @@ def create_session_manager(self):
179180
self.session_manager = self.context.session_manager
180181
self.user_id = USER_ID
181182

182-
def _create_session(self, auth_req, sub_type="public", sector_identifier="", authn_info=""):
183+
def _create_session(self, auth_req, sub_type="public", sector_identifier="", authn_info="", token_usage_rules=""):
183184
if sector_identifier:
184185
authz_req = auth_req.copy()
185186
authz_req["sector_identifier_uri"] = sector_identifier
@@ -189,7 +190,7 @@ def _create_session(self, auth_req, sub_type="public", sector_identifier="", aut
189190
client_id = authz_req["client_id"]
190191
ae = create_authn_event(self.user_id, authn_info=authn_info)
191192
return self.session_manager.create_session(
192-
ae, authz_req, self.user_id, client_id=client_id, sub_type=sub_type
193+
ae, authz_req, self.user_id, client_id=client_id, sub_type=sub_type, token_usage_rules=token_usage_rules
193194
)
194195

195196
def _mint_code(self, grant, session_id):
@@ -247,6 +248,57 @@ def test_id_token_payload_0(self):
247248
"sid",
248249
}
249250

251+
def test_id_token_lifetime_per_client(self):
252+
grant_config = {
253+
"usage_rules": {
254+
"authorization_code": {
255+
"supports_minting": [
256+
"access_token",
257+
"refresh_token",
258+
"id_token",
259+
],
260+
"max_usage": 1,
261+
"expires_in": 120,
262+
},
263+
"access_token": {"expires_in": 600},
264+
},
265+
"expires_in": 43200,
266+
}
267+
self.context.cdb["client_1"]["token_usage_rules"] = {
268+
"id_token": {
269+
"expires_in": 100
270+
}
271+
}
272+
273+
self.context.authz = AuthzHandling(
274+
self.server.get_endpoint_context, grant_config=grant_config
275+
)
276+
277+
token_usage_rules = self.context.authz.usage_rules("client_1")
278+
session_id = self._create_session(auth_req=AREQ, token_usage_rules=token_usage_rules)
279+
280+
grant = self.session_manager[session_id]
281+
code = self._mint_code(grant, session_id)
282+
id_token = self._mint_id_token(grant, session_id, code)
283+
_jwt = factory(id_token.value)
284+
payload = _jwt.jwt.payload()
285+
286+
assert set(payload.keys()) == {
287+
"aud",
288+
"sub",
289+
"auth_time",
290+
"nonce",
291+
"iat",
292+
"exp",
293+
"email",
294+
"email_verified",
295+
"jti",
296+
"scope",
297+
"iss",
298+
"sid",
299+
}
300+
assert payload["exp"] - payload["iat"] == 100
301+
250302
def test_id_token_payload_with_code(self):
251303
session_id = self._create_session(AREQ)
252304
grant = self.session_manager[session_id]

0 commit comments

Comments
 (0)