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

Commit 030991d

Browse files
committed
Properly handle id token introsprection
1 parent e4d59ab commit 030991d

3 files changed

Lines changed: 32 additions & 4 deletions

File tree

src/oidcop/oauth2/introspection.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
from oidcop.endpoint import Endpoint
88
from oidcop.token.exception import UnknownToken
9+
from oidcop.token.exception import WrongTokenClass
910

1011
LOGGER = logging.getLogger(__name__)
1112

@@ -94,7 +95,7 @@ def process_request(self, request=None, release: Optional[list] = None, **kwargs
9495
_session_info = _context.session_manager.get_session_info_by_token(
9596
request_token, grant=True
9697
)
97-
except UnknownToken:
98+
except (UnknownToken, WrongTokenClass):
9899
return {"response_args": _resp}
99100

100101
grant = _session_info["grant"]

src/oidcop/session/manager.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from .info import ClientSessionInfo
1919
from .info import UserSessionInfo
2020
from ..token import UnknownToken
21+
from ..token import WrongTokenClass
2122
from ..token.handler import TokenHandler
2223

2324
logger = logging.getLogger(__name__)
@@ -457,16 +458,20 @@ def get_session_info_by_token(
457458
authorization_request: bool = False,
458459
) -> dict:
459460
_token_info = self.token_handler.info(token_value)
460-
sid = _token_info["sid"]
461-
session_info = self.get_session_info(
461+
sid = _token_info.get("sid")
462+
# If the token is an ID Token then the sid will not be in the
463+
# _token_info
464+
if not sid:
465+
raise WrongTokenClass
466+
467+
return self.get_session_info(
462468
sid,
463469
user_session_info=user_session_info,
464470
client_session_info=client_session_info,
465471
grant=grant,
466472
authentication_event=authentication_event,
467473
authorization_request=authorization_request,
468474
)
469-
return session_info
470475

471476
def get_session_id_by_token(self, token_value: str) -> str:
472477
_token_info = self.token_handler.info(token_value)

tests/test_31_oauth2_introspection.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,9 @@ def create_endpoint(self, jwt_token):
115115
"class": "oidcop.token.jwt_token.JWTToken",
116116
"kwargs": {"lifetime": 3600, "aud": ["https://example.org/appl"],},
117117
},
118+
"id_token": {
119+
"class": "oidcop.token.id_token.IDToken",
120+
}
118121
},
119122
"endpoint": {
120123
"authorization": {
@@ -469,3 +472,22 @@ def test_revoked_access_token(self):
469472
)
470473
_resp = self.introspection_endpoint.process_request(_req)
471474
assert _resp["response_args"]["active"] is False
475+
476+
def test_introspect_id_token(self):
477+
session_id = self._create_session(AUTH_REQ)
478+
grant = self.token_endpoint.server_get("endpoint_context").authz(session_id, AUTH_REQ)
479+
self.session_manager[session_id] = grant
480+
code = self._mint_token("authorization_code", grant, session_id)
481+
id_token = self._mint_token("id_token", grant, session_id, code)
482+
483+
_context = self.introspection_endpoint.server_get("endpoint_context")
484+
_req = self.introspection_endpoint.parse_request(
485+
{
486+
"token": id_token.value,
487+
"client_id": "client_1",
488+
"client_secret": _context.cdb["client_1"]["client_secret"],
489+
}
490+
)
491+
_resp = self.introspection_endpoint.process_request(_req)
492+
493+
assert _resp["response_args"]["active"] is False

0 commit comments

Comments
 (0)