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

Commit 662e7d7

Browse files
committed
First walk through implementing our agreement on token_type, token_syntax and token_class.
1 parent 0fe8067 commit 662e7d7

28 files changed

Lines changed: 341 additions & 297 deletions

src/oidcop/oauth2/authorization.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -301,12 +301,12 @@ def verify_response_type(self, request: Union[Message, dict], cinfo: dict) -> bo
301301
# Is the asked for response_type among those that are permitted
302302
return set(request["response_type"]) in _registered
303303

304-
def mint_token(self, token_type, grant, session_id, based_on=None, **kwargs):
305-
usage_rules = grant.usage_rules.get(token_type, {})
304+
def mint_token(self, token_class, grant, session_id, based_on=None, **kwargs):
305+
usage_rules = grant.usage_rules.get(token_class, {})
306306
token = grant.mint_token(
307307
session_id=session_id,
308308
endpoint_context=self.server_get("endpoint_context"),
309-
token_type=token_type,
309+
token_class=token_class,
310310
based_on=based_on,
311311
usage_rules=usage_rules,
312312
**kwargs,
@@ -677,7 +677,7 @@ def create_authn_response(self, request: Union[dict, Message], sid: str) -> dict
677677

678678
if "code" in request["response_type"]:
679679
_code = self.mint_token(
680-
token_type="authorization_code", grant=grant, session_id=_sinfo["session_id"],
680+
token_class="authorization_code", grant=grant, session_id=_sinfo["session_id"],
681681
)
682682
aresp["code"] = _code.value
683683
handled_response_type.append("code")
@@ -686,7 +686,7 @@ def create_authn_response(self, request: Union[dict, Message], sid: str) -> dict
686686

687687
if "token" in rtype:
688688
_access_token = self.mint_token(
689-
token_type="access_token", grant=grant, session_id=_sinfo["session_id"],
689+
token_class="access_token", grant=grant, session_id=_sinfo["session_id"],
690690
)
691691
aresp["access_token"] = _access_token.value
692692
aresp["token_type"] = "Bearer"
@@ -707,7 +707,7 @@ def create_authn_response(self, request: Union[dict, Message], sid: str) -> dict
707707

708708
try:
709709
id_token = self.mint_token(
710-
token_type="id_token",
710+
token_class="id_token",
711711
grant=grant,
712712
session_id=_sinfo["session_id"],
713713
**kwargs,

src/oidcop/oauth2/introspection.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def __init__(self, server_get, **kwargs):
2626

2727
def _introspect(self, token, client_id, grant):
2828
# Make sure that the token is an access_token or a refresh_token
29-
if token.type not in ["access_token", "refresh_token"]:
29+
if token.token_class not in ["access_token", "refresh_token"]:
3030
return None
3131

3232
if not token.is_active():
@@ -44,7 +44,7 @@ def _introspect(self, token, client_id, grant):
4444
"active": True,
4545
"scope": " ".join(scope),
4646
"client_id": client_id,
47-
"token_type": token.type,
47+
"token_class": token.token_class,
4848
"exp": token.expires_at,
4949
"iat": token.issued_at,
5050
"sub": grant.sub,

src/oidcop/oauth2/token.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ def process_request(self, req: Union[Message, dict], **kwargs):
4848

4949
def _mint_token(
5050
self,
51-
type: str,
51+
token_class: str,
5252
grant: Grant,
5353
session_id: str,
5454
client_id: str,
@@ -75,8 +75,8 @@ def _mint_token(
7575
token = grant.mint_token(
7676
session_id,
7777
endpoint_context=_context,
78-
token_type=type,
79-
token_handler=_mngr.token_handler[type],
78+
token_class=token_class,
79+
token_handler=_mngr.token_handler[token_class],
8080
based_on=based_on,
8181
usage_rules=usage_rules,
8282
**_args,
@@ -143,7 +143,7 @@ def process_request(self, req: Union[Message, dict], **kwargs):
143143
if "access_token" in _supports_minting:
144144
try:
145145
token = self._mint_token(
146-
type="access_token",
146+
token_class="access_token",
147147
grant=grant,
148148
session_id=_session_info["session_id"],
149149
client_id=_session_info["client_id"],
@@ -159,7 +159,7 @@ def process_request(self, req: Union[Message, dict], **kwargs):
159159
if issue_refresh and "refresh_token" in _supports_minting:
160160
try:
161161
refresh_token = self._mint_token(
162-
type="refresh_token",
162+
token_class="refresh_token",
163163
grant=grant,
164164
session_id=_session_info["session_id"],
165165
client_id=_session_info["client_id"],
@@ -227,7 +227,7 @@ def process_request(self, req: Union[Message, dict], **kwargs):
227227
_grant = _session_info["grant"]
228228
token = _grant.get_token(token_value)
229229
access_token = self._mint_token(
230-
type="access_token",
230+
token_class="access_token",
231231
grant=_grant,
232232
session_id=_session_info["session_id"],
233233
client_id=_session_info["client_id"],
@@ -236,7 +236,7 @@ def process_request(self, req: Union[Message, dict], **kwargs):
236236

237237
_resp = {
238238
"access_token": access_token.value,
239-
"token_type": access_token.type,
239+
"token_type": access_token.token_type,
240240
"scope": _grant.scope,
241241
}
242242

@@ -246,7 +246,7 @@ def process_request(self, req: Union[Message, dict], **kwargs):
246246
_mints = token.usage_rules.get("supports_minting")
247247
if "refresh_token" in _mints:
248248
refresh_token = self._mint_token(
249-
type="refresh_token",
249+
token_class="refresh_token",
250250
grant=_grant,
251251
session_id=_session_info["session_id"],
252252
client_id=_session_info["client_id"],

src/oidcop/oidc/token.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ def process_request(self, req: Union[Message, dict], **kwargs):
8989
if "access_token" in _supports_minting:
9090
try:
9191
token = self._mint_token(
92-
type="access_token",
92+
token_class="access_token",
9393
grant=grant,
9494
session_id=_session_info["session_id"],
9595
client_id=_session_info["client_id"],
@@ -105,7 +105,7 @@ def process_request(self, req: Union[Message, dict], **kwargs):
105105
if issue_refresh and "refresh_token" in _supports_minting:
106106
try:
107107
refresh_token = self._mint_token(
108-
type="refresh_token",
108+
token_class="refresh_token",
109109
grant=grant,
110110
session_id=_session_info["session_id"],
111111
client_id=_session_info["client_id"],
@@ -123,7 +123,7 @@ def process_request(self, req: Union[Message, dict], **kwargs):
123123
if "id_token" in _based_on.usage_rules.get("supports_minting"):
124124
try:
125125
_idtoken = self._mint_token(
126-
type="id_token",
126+
token_class="id_token",
127127
grant=grant,
128128
session_id=_session_info["session_id"],
129129
client_id=_session_info["client_id"],
@@ -202,7 +202,7 @@ def process_request(self, req: Union[Message, dict], **kwargs):
202202

203203
token = _grant.get_token(token_value)
204204
access_token = self._mint_token(
205-
type="access_token",
205+
token_class="access_token",
206206
grant=_grant,
207207
session_id=_session_info["session_id"],
208208
client_id=_session_info["client_id"],
@@ -221,7 +221,7 @@ def process_request(self, req: Union[Message, dict], **kwargs):
221221
_mints = token.usage_rules.get("supports_minting")
222222
if "refresh_token" in _mints:
223223
refresh_token = self._mint_token(
224-
type="refresh_token",
224+
token_class="refresh_token",
225225
grant=_grant,
226226
session_id=_session_info["session_id"],
227227
client_id=_session_info["client_id"],
@@ -233,7 +233,7 @@ def process_request(self, req: Union[Message, dict], **kwargs):
233233
if "id_token" in _mints:
234234
try:
235235
_idtoken = self._mint_token(
236-
type="refresh_token",
236+
token_class="refresh_token",
237237
grant=_grant,
238238
session_id=_session_info["session_id"],
239239
client_id=_session_info["client_id"],

src/oidcop/oidc/userinfo.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ def process_request(self, request=None, **kwargs):
110110
_grant = _session_info["grant"]
111111
token = _grant.get_token(request["access_token"])
112112
# should be an access token
113-
if token.type != "access_token":
113+
if token.token_class != "access_token":
114114
return self.error_cls(error="invalid_token", error_description="Wrong type of token")
115115

116116
# And it should be valid

src/oidcop/session/claims.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,12 @@ class ClaimsInterface:
3030
def __init__(self, server_get):
3131
self.server_get = server_get
3232

33-
def authorization_request_claims(self, session_id: str, usage: Optional[str] = "") -> dict:
33+
def authorization_request_claims(self,
34+
session_id: str,
35+
claims_release_ref: Optional[str] = "") -> dict:
3436
_grant = self.server_get("endpoint_context").session_manager.get_grant(session_id)
3537
if _grant.authorization_request and "claims" in _grant.authorization_request:
36-
return _grant.authorization_request["claims"].get(usage, {})
38+
return _grant.authorization_request["claims"].get(claims_release_ref, {})
3739

3840
return {}
3941

@@ -63,19 +65,19 @@ def _get_module(self, usage, endpoint_context):
6365

6466
return module
6567

66-
def get_claims(self, session_id: str, scopes: str, usage: str) -> dict:
68+
def get_claims(self, session_id: str, scopes: str, claims_release_ref: str) -> dict:
6769
"""
6870
6971
:param session_id: Session identifier
7072
:param scopes: Scopes
71-
:param usage: Where to use the claims. One of
72-
"userinfo"/"id_token"/"introspection"/"access_token"
73+
:param claims_release_ref: Where to release the claims. One of
74+
"userinfo"/"id_token"/"introspection"/"access_token"
7375
:return: Claims specification as a dictionary.
7476
"""
7577

7678
_context = self.server_get("endpoint_context")
7779
# which endpoint module configuration to get the base claims from
78-
module = self._get_module(usage, _context)
80+
module = self._get_module(claims_release_ref, _context)
7981

8082
if module:
8183
base_claims = module.kwargs.get("base_claims", {})
@@ -86,7 +88,7 @@ def get_claims(self, session_id: str, scopes: str, usage: str) -> dict:
8688

8789
# Can there be per client specification of which claims to use.
8890
if module.kwargs.get("enable_claims_per_client"):
89-
claims = self._get_client_claims(client_id, usage)
91+
claims = self._get_client_claims(client_id, claims_release_ref)
9092
else:
9193
claims = {}
9294

@@ -102,7 +104,8 @@ def get_claims(self, session_id: str, scopes: str, usage: str) -> dict:
102104

103105
# Bring in claims specification from the authorization request
104106
# This only goes for ID Token and user info
105-
request_claims = self.authorization_request_claims(session_id=session_id, usage=usage)
107+
request_claims = self.authorization_request_claims(session_id=session_id,
108+
claims_release_ref=claims_release_ref)
106109

107110
# This will add claims that has not be added before and
108111
# set filters on those claims that also appears in one of the sources above

src/oidcop/session/grant.py

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,6 @@ def __init__(
4141
self.resources = resources
4242

4343

44-
GRANT_TYPE_MAP = {
45-
"authorization_code": "code",
46-
"access_token": "access_token",
47-
"refresh_token": "refresh_token",
48-
"id_token": "id_token",
49-
}
50-
51-
5244
def find_token(issued, token_id):
5345
for iss in issued:
5446
if iss.id == token_id:
@@ -179,12 +171,17 @@ def payload_arguments(
179171
self,
180172
session_id: str,
181173
endpoint_context,
182-
token_type: str,
174+
claims_release_ref: str,
183175
scope: Optional[dict] = None,
184176
extra_payload: Optional[dict] = None,
185177
) -> dict:
186178
"""
187179
180+
:param session_id:
181+
:param endpoint_context:
182+
:param claims_release_ref: One of "userinfo", "introspection", "id_token", "access_token"
183+
:param scope:
184+
:param extra_payload:
188185
:return: dictionary containing information to place in a token value
189186
"""
190187
if not scope:
@@ -205,7 +202,7 @@ def payload_arguments(
205202
payload.update({"client_id": client_id, "sub": client_id})
206203

207204
_claims_restriction = endpoint_context.claims_interface.get_claims(
208-
session_id, scopes=scope, usage=token_type
205+
session_id, scopes=scope, claims_release_ref=claims_release_ref
209206
)
210207
user_id, _, _ = endpoint_context.session_manager.decrypt_session_id(session_id)
211208
user_info = endpoint_context.claims_interface.get_user_claims(user_id, _claims_restriction)
@@ -217,7 +214,7 @@ def mint_token(
217214
self,
218215
session_id: str,
219216
endpoint_context: object,
220-
token_type: str,
217+
token_class: str,
221218
token_handler: TokenHandler = None,
222219
based_on: Optional[SessionToken] = None,
223220
usage_rules: Optional[dict] = None,
@@ -240,42 +237,46 @@ def mint_token(
240237
return None
241238

242239
if based_on:
243-
if based_on.supports_minting(token_type) is False:
244-
raise MintingNotAllowed(f"Minting of {token_type} not supported")
240+
if based_on.supports_minting(token_class) is False:
241+
raise MintingNotAllowed(f"Minting of {token_class} not supported")
245242
if not based_on.is_active():
246243
raise MintingNotAllowed("Token inactive")
247244
_base_on_ref = based_on.value
248245
else:
249246
_base_on_ref = None
250247

251-
if usage_rules is None and token_type in self.usage_rules:
252-
usage_rules = self.usage_rules[token_type]
248+
if usage_rules is None and token_class in self.usage_rules:
249+
usage_rules = self.usage_rules[token_class]
253250

254-
token_class = self.token_map.get(token_type)
255-
if token_type == "id_token":
251+
_class = self.token_map.get(token_class)
252+
if token_class == "id_token":
256253
class_args = {k: v for k, v in kwargs.items() if k not in ["code", "access_token"]}
257254
handler_args = {k: v for k, v in kwargs.items() if k in ["code", "access_token"]}
258255
else:
259256
class_args = kwargs
260257
handler_args = {}
261258

262-
if token_class:
263-
item = token_class(
264-
type=token_type,
259+
if _class:
260+
item = _class(
261+
token_class=token_class,
265262
based_on=_base_on_ref,
266263
usage_rules=usage_rules,
267264
scope=scope,
268265
**class_args,
269266
)
270267
if token_handler is None:
271-
token_handler = endpoint_context.session_manager.token_handler.handler[
272-
GRANT_TYPE_MAP[token_type]
273-
]
268+
token_handler = endpoint_context.session_manager.token_handler.handler[token_class]
269+
270+
# Only access_token and id_token can give rise to claims release
271+
if token_class in ["access_token", "id_token"]:
272+
claims_release_ref = token_class
273+
else:
274+
claims_release_ref = ""
274275

275276
token_payload = self.payload_arguments(
276277
session_id,
277278
endpoint_context,
278-
token_type=token_type,
279+
claims_release_ref=claims_release_ref,
279280
scope=scope,
280281
extra_payload=handler_args,
281282
)

0 commit comments

Comments
 (0)