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

Commit 11914df

Browse files
committed
Determine which scope to use.
1 parent 0fe8067 commit 11914df

2 files changed

Lines changed: 86 additions & 0 deletions

File tree

src/oidcop/session/grant.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,18 @@ def get(self) -> object:
175175
resources=self.resources,
176176
)
177177

178+
def find_scope(self, based_on):
179+
if based_on.scope:
180+
return based_on.scope
181+
182+
if based_on.based_on:
183+
# Don't expect there to be that many tokens based on one grant so a linear search
184+
# should be OK.
185+
for token in self.issued_token:
186+
if token.value == based_on.based_on:
187+
return self.find_scope(token)
188+
return []
189+
178190
def payload_arguments(
179191
self,
180192
session_id: str,
@@ -260,6 +272,10 @@ def mint_token(
260272
handler_args = {}
261273

262274
if token_class:
275+
if not scope:
276+
if based_on:
277+
scope = self.find_scope(based_on)
278+
263279
item = token_class(
264280
type=token_type,
265281
based_on=_base_on_ref,

tests/test_01_grant.py

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -438,3 +438,73 @@ def test_get_usage_rules(self):
438438

439439
# client specific usage rules
440440
self.endpoint_context.cdb["client_id"] = {"access_token": {"expires_in": 600}}
441+
442+
def test_assigned_scope(self):
443+
session_id = self._create_session(AREQ)
444+
session_info = self.endpoint_context.session_manager.get_session_info(
445+
session_id=session_id, grant=True
446+
)
447+
grant = session_info["grant"]
448+
code = grant.mint_token(
449+
session_id,
450+
endpoint_context=self.endpoint_context,
451+
token_type="authorization_code",
452+
token_handler=TOKEN_HANDLER["authorization_code"],
453+
)
454+
455+
code.scope = ["openid", "email"]
456+
457+
access_token = grant.mint_token(
458+
session_id,
459+
endpoint_context=self.endpoint_context,
460+
token_type="access_token",
461+
token_handler=TOKEN_HANDLER["access_token"],
462+
based_on=code,
463+
)
464+
465+
assert access_token.scope == code.scope
466+
467+
def test_assigned_scope_2nd(self):
468+
session_id = self._create_session(AREQ)
469+
session_info = self.endpoint_context.session_manager.get_session_info(
470+
session_id=session_id, grant=True
471+
)
472+
grant = session_info["grant"]
473+
code = grant.mint_token(
474+
session_id,
475+
endpoint_context=self.endpoint_context,
476+
token_type="authorization_code",
477+
token_handler=TOKEN_HANDLER["authorization_code"],
478+
)
479+
480+
code.scope = ["openid", "email"]
481+
482+
refresh_token = grant.mint_token(
483+
session_id,
484+
endpoint_context=self.endpoint_context,
485+
token_type="refresh_token",
486+
token_handler=TOKEN_HANDLER["refresh_token"],
487+
based_on=code,
488+
)
489+
490+
access_token = grant.mint_token(
491+
session_id,
492+
endpoint_context=self.endpoint_context,
493+
token_type="access_token",
494+
token_handler=TOKEN_HANDLER["access_token"],
495+
based_on=refresh_token,
496+
)
497+
498+
assert access_token.scope == code.scope
499+
500+
refresh_token.scope = ["openid", "xyz"]
501+
502+
access_token = grant.mint_token(
503+
session_id,
504+
endpoint_context=self.endpoint_context,
505+
token_type="access_token",
506+
token_handler=TOKEN_HANDLER["access_token"],
507+
based_on=refresh_token,
508+
)
509+
510+
assert access_token.scope == refresh_token.scope

0 commit comments

Comments
 (0)