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

Commit 3c500b6

Browse files
authored
Merge pull request #74 from IdentityPython/token_type
Implemented our agreement on terms for tokens
2 parents 0af265b + aea4b54 commit 3c500b6

28 files changed

Lines changed: 375 additions & 308 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: 10 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():
@@ -47,13 +47,21 @@ def _introspect(self, token, client_id, grant):
4747
"active": True,
4848
"scope": " ".join(scope),
4949
"client_id": client_id,
50-
"token_type": token.type,
50+
"token_class": token.token_class,
5151
"exp": token.expires_at,
5252
"iat": token.issued_at,
5353
"sub": grant.sub,
5454
"iss": _context.issuer,
5555
}
5656

57+
try:
58+
_token_type = token.token_type
59+
except AttributeError:
60+
_token_type = None
61+
62+
if _token_type:
63+
ret["token_type"] = _token_type
64+
5765
if aud:
5866
ret["aud"] = aud
5967

src/oidcop/oauth2/token.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,13 @@ 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,
5555
based_on: Optional[SessionToken] = None,
5656
token_args: Optional[dict] = None,
57+
token_type: Optional[str] = ""
5758
) -> SessionToken:
5859
_context = self.endpoint.server_get("endpoint_context")
5960
_mngr = _context.session_manager
@@ -75,10 +76,11 @@ def _mint_token(
7576
token = grant.mint_token(
7677
session_id,
7778
endpoint_context=_context,
78-
token_type=type,
79-
token_handler=_mngr.token_handler[type],
79+
token_class=token_class,
80+
token_handler=_mngr.token_handler[token_class],
8081
based_on=based_on,
8182
usage_rules=usage_rules,
83+
token_type=token_type,
8284
**_args,
8385
)
8486

@@ -143,7 +145,7 @@ def process_request(self, req: Union[Message, dict], **kwargs):
143145
if "access_token" in _supports_minting:
144146
try:
145147
token = self._mint_token(
146-
type="access_token",
148+
token_class="access_token",
147149
grant=grant,
148150
session_id=_session_info["session_id"],
149151
client_id=_session_info["client_id"],
@@ -159,7 +161,7 @@ def process_request(self, req: Union[Message, dict], **kwargs):
159161
if issue_refresh and "refresh_token" in _supports_minting:
160162
try:
161163
refresh_token = self._mint_token(
162-
type="refresh_token",
164+
token_class="refresh_token",
163165
grant=grant,
164166
session_id=_session_info["session_id"],
165167
client_id=_session_info["client_id"],
@@ -227,7 +229,7 @@ def process_request(self, req: Union[Message, dict], **kwargs):
227229
_grant = _session_info["grant"]
228230
token = _grant.get_token(token_value)
229231
access_token = self._mint_token(
230-
type="access_token",
232+
token_class="access_token",
231233
grant=_grant,
232234
session_id=_session_info["session_id"],
233235
client_id=_session_info["client_id"],
@@ -236,7 +238,7 @@ def process_request(self, req: Union[Message, dict], **kwargs):
236238

237239
_resp = {
238240
"access_token": access_token.value,
239-
"token_type": access_token.type,
241+
"token_type": access_token.token_type,
240242
"scope": _grant.scope,
241243
}
242244

@@ -246,7 +248,7 @@ def process_request(self, req: Union[Message, dict], **kwargs):
246248
_mints = token.usage_rules.get("supports_minting")
247249
if "refresh_token" in _mints:
248250
refresh_token = self._mint_token(
249-
type="refresh_token",
251+
token_class="refresh_token",
250252
grant=_grant,
251253
session_id=_session_info["session_id"],
252254
client_id=_session_info["client_id"],

src/oidcop/oidc/token.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -89,11 +89,12 @@ 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"],
9696
based_on=_based_on,
97+
token_type=token_type,
9798
)
9899
except MintingNotAllowed as err:
99100
logger.warning(err)
@@ -105,7 +106,7 @@ def process_request(self, req: Union[Message, dict], **kwargs):
105106
if issue_refresh and "refresh_token" in _supports_minting:
106107
try:
107108
refresh_token = self._mint_token(
108-
type="refresh_token",
109+
token_class="refresh_token",
109110
grant=grant,
110111
session_id=_session_info["session_id"],
111112
client_id=_session_info["client_id"],
@@ -123,7 +124,7 @@ def process_request(self, req: Union[Message, dict], **kwargs):
123124
if "id_token" in _based_on.usage_rules.get("supports_minting"):
124125
try:
125126
_idtoken = self._mint_token(
126-
type="id_token",
127+
token_class="id_token",
127128
grant=grant,
128129
session_id=_session_info["session_id"],
129130
client_id=_session_info["client_id"],
@@ -202,11 +203,12 @@ def process_request(self, req: Union[Message, dict], **kwargs):
202203

203204
token = _grant.get_token(token_value)
204205
access_token = self._mint_token(
205-
type="access_token",
206+
token_class="access_token",
206207
grant=_grant,
207208
session_id=_session_info["session_id"],
208209
client_id=_session_info["client_id"],
209210
based_on=token,
211+
token_type=token_type
210212
)
211213

212214
_resp = {
@@ -221,7 +223,7 @@ def process_request(self, req: Union[Message, dict], **kwargs):
221223
_mints = token.usage_rules.get("supports_minting")
222224
if "refresh_token" in _mints:
223225
refresh_token = self._mint_token(
224-
type="refresh_token",
226+
token_class="refresh_token",
225227
grant=_grant,
226228
session_id=_session_info["session_id"],
227229
client_id=_session_info["client_id"],
@@ -233,7 +235,7 @@ def process_request(self, req: Union[Message, dict], **kwargs):
233235
if "id_token" in _mints:
234236
try:
235237
_idtoken = self._mint_token(
236-
type="refresh_token",
238+
token_class="refresh_token",
237239
grant=_grant,
238240
session_id=_session_info["session_id"],
239241
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: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,17 @@ def available_claims(endpoint_context):
2525

2626
class ClaimsInterface:
2727
init_args = {"add_claims_by_scope": False, "enable_claims_per_client": False}
28-
claims_types = ["userinfo", "introspection", "id_token", "access_token"]
28+
claims_release_points = ["userinfo", "introspection", "id_token", "access_token"]
2929

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_point: 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_point, {})
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_point: 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_point: 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_point, _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_point)
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_point=claims_release_point)
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
@@ -113,7 +116,7 @@ def get_claims(self, session_id: str, scopes: str, usage: str) -> dict:
113116

114117
def get_claims_all_usage(self, session_id: str, scopes: str) -> dict:
115118
_claims = {}
116-
for usage in self.claims_types:
119+
for usage in self.claims_release_points:
117120
_claims[usage] = self.get_claims(session_id, scopes, usage)
118121
return _claims
119122

@@ -189,7 +192,7 @@ def by_schema(cls, **kwa):
189192

190193

191194
class OAuth2ClaimsInterface(ClaimsInterface):
192-
claims_types = ["introspection", "access_token"]
195+
claims_release_points = ["introspection", "access_token"]
193196

194197
def _get_module(self, usage, endpoint_context):
195198
module = None
@@ -205,6 +208,6 @@ def _get_module(self, usage, endpoint_context):
205208

206209
def get_claims_all_usage(self, session_id: str, scopes: str) -> dict:
207210
_claims = {}
208-
for usage in self.claims_types:
211+
for usage in self.claims_release_points:
209212
_claims[usage] = self.get_claims(session_id, scopes, usage)
210213
return _claims

0 commit comments

Comments
 (0)