Skip to content

Commit 23f8ae2

Browse files
committed
Add logout redirect
1 parent 82a80c0 commit 23f8ae2

3 files changed

Lines changed: 22 additions & 0 deletions

File tree

docs/how-to/authenticate.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,3 +63,9 @@ To log out and securely remove the cached access token, follow these steps:
6363
```
6464
Logged out
6565
```
66+
67+
68+
> [!NOTE]
69+
> The login and logout instructions above apply to the CLI. If you are using `oauth2-proxy` to secure the Swagger
70+
> UI documentation page, you can log out by visiting the `/logout` URL. For other OIDC providers, update the
71+
> `oidc.logout_redirect_endpoint` configuration to the appropriate logout endpoint.

src/blueapi/config.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,9 @@ class OIDCConfig(BlueapiBaseModel):
162162
)
163163
client_id: str = Field(description="Client ID")
164164
client_audience: str = Field(description="Client Audience(s)", default="blueapi")
165+
logout_redirect_endpoint: str = Field(
166+
description="The oidc endpoint required to logout", default="/oauth2/sign_out"
167+
)
165168

166169
@cached_property
167170
def _config_from_oidc_url(self) -> dict[str, Any]:

src/blueapi/service/main.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
status,
1818
)
1919
from fastapi.middleware.cors import CORSMiddleware
20+
from fastapi.responses import RedirectResponse
2021
from fastapi.security import OAuth2AuthorizationCodeBearer
2122
from observability_utils.tracing import (
2223
add_span_attributes,
@@ -534,6 +535,18 @@ def health_probe() -> HealthProbeResponse:
534535
return HealthProbeResponse(status=Health.OK)
535536

536537

538+
@secure_router.get("/logout", status_code=status.HTTP_200_OK, include_in_schema=False)
539+
def logout(runner: Annotated[WorkerDispatcher, Depends(_runner)]) -> RedirectResponse:
540+
"""Redirect to logout url"""
541+
config = runner.run(interface.get_oidc_config)
542+
if config is None:
543+
raise HTTPException(status_code=status.HTTP_204_NO_CONTENT)
544+
return RedirectResponse(
545+
url=config.logout_redirect_endpoint,
546+
headers={"X-Auth-Request-Redirect": config.end_session_endpoint},
547+
)
548+
549+
537550
@start_as_current_span(TRACER, "config")
538551
def start(config: ApplicationConfig):
539552
import uvicorn

0 commit comments

Comments
 (0)