Loading src/portal_service/api/dependencies.py +5 −0 Changes for src/portal_service/api/dependencies.py: 5 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -168,6 +168,11 @@ async def get_current_user(session: CurrentSessionDep, verifier: TokenVerifierDe except AuthenticationError as exc: logger.info("session token no longer usable", error=str(exc)) raise HTTPException(status.HTTP_401_UNAUTHORIZED, "Not authenticated") from exc except IdentityProviderUnavailableError as exc: logger.error("could not verify the session token", error=str(exc)) raise HTTPException( status.HTTP_503_SERVICE_UNAVAILABLE, "Authentication service unavailable" ) from exc CurrentUserDep = Annotated[TokenClaims, Depends(get_current_user)] Loading tests/unit/test_session_refresh.py +19 −0 Changes for tests/unit/test_session_refresh.py: 19 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -9,10 +9,12 @@ disabled or the session ended there. from collections.abc import Callable, Iterator from datetime import UTC, datetime, timedelta import jwt import pytest from fastapi import FastAPI from fastapi.testclient import TestClient from portal_service.adapters.keycloak import token_verifier as token_verifier_module from portal_service.api.dependencies import get_identity_provider, get_login_session_repo from portal_service.application.session_crypto import ( SessionCredentials, Loading Loading @@ -226,6 +228,23 @@ def test_keycloak_being_down_keeps_the_session( assert credentials.session_id_hash in sessions.rows def test_signing_keys_being_unreachable_is_a_503( client: TestClient, sessions: FakeLoginSessionRepository, make_token: Callable[..., str], monkeypatch: pytest.MonkeyPatch, ) -> None: _open_session(client, sessions, make_token(), access_token_expires_in=timedelta(minutes=5)) class _UnreachableKeys: def get_signing_key_from_jwt(self, token: str) -> None: raise jwt.PyJWKClientConnectionError("JWKS endpoint unreachable") monkeypatch.setattr(token_verifier_module, "_jwks_client_for", lambda _uri: _UnreachableKeys()) assert client.get("/api/auth/me").status_code == 503 def test_a_session_without_a_refresh_token_cannot_be_renewed( client: TestClient, sessions: FakeLoginSessionRepository, Loading Loading
src/portal_service/api/dependencies.py +5 −0 Changes for src/portal_service/api/dependencies.py: 5 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -168,6 +168,11 @@ async def get_current_user(session: CurrentSessionDep, verifier: TokenVerifierDe except AuthenticationError as exc: logger.info("session token no longer usable", error=str(exc)) raise HTTPException(status.HTTP_401_UNAUTHORIZED, "Not authenticated") from exc except IdentityProviderUnavailableError as exc: logger.error("could not verify the session token", error=str(exc)) raise HTTPException( status.HTTP_503_SERVICE_UNAVAILABLE, "Authentication service unavailable" ) from exc CurrentUserDep = Annotated[TokenClaims, Depends(get_current_user)] Loading
tests/unit/test_session_refresh.py +19 −0 Changes for tests/unit/test_session_refresh.py: 19 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -9,10 +9,12 @@ disabled or the session ended there. from collections.abc import Callable, Iterator from datetime import UTC, datetime, timedelta import jwt import pytest from fastapi import FastAPI from fastapi.testclient import TestClient from portal_service.adapters.keycloak import token_verifier as token_verifier_module from portal_service.api.dependencies import get_identity_provider, get_login_session_repo from portal_service.application.session_crypto import ( SessionCredentials, Loading Loading @@ -226,6 +228,23 @@ def test_keycloak_being_down_keeps_the_session( assert credentials.session_id_hash in sessions.rows def test_signing_keys_being_unreachable_is_a_503( client: TestClient, sessions: FakeLoginSessionRepository, make_token: Callable[..., str], monkeypatch: pytest.MonkeyPatch, ) -> None: _open_session(client, sessions, make_token(), access_token_expires_in=timedelta(minutes=5)) class _UnreachableKeys: def get_signing_key_from_jwt(self, token: str) -> None: raise jwt.PyJWKClientConnectionError("JWKS endpoint unreachable") monkeypatch.setattr(token_verifier_module, "_jwks_client_for", lambda _uri: _UnreachableKeys()) assert client.get("/api/auth/me").status_code == 503 def test_a_session_without_a_refresh_token_cannot_be_renewed( client: TestClient, sessions: FakeLoginSessionRepository, Loading