Add user self-care link & setting for supporting providers

This commit is contained in:
phil 2025-01-26 19:08:49 +01:00
parent 7ab715da5a
commit dc93c7c05b
4 changed files with 33 additions and 5 deletions

View file

@ -94,15 +94,16 @@ async def home(
now = datetime.now() now = datetime.now()
if oidc_provider and ( if oidc_provider and (
( (
provider := providers_settings.get( oidc_provider_settings := providers_settings.get(
request.session.get("oidc_provider_id", "") request.session.get("oidc_provider_id", "")
) )
) )
is not None is not None
): ):
resources = provider.resources resources = oidc_provider_settings.resources
else: else:
resources = [] resources = []
oidc_provider_settings = None
return templates.TemplateResponse( return templates.TemplateResponse(
name="home.html", name="home.html",
request=request, request=request,
@ -110,6 +111,7 @@ async def home(
"settings": settings.model_dump(), "settings": settings.model_dump(),
"user": user, "user": user,
"now": now, "now": now,
"oidc_provider_settings": oidc_provider_settings,
"resources": resources, "resources": resources,
"user_info_details": ( "user_info_details": (
pretty_details(user, now) pretty_details(user, now)
@ -212,6 +214,20 @@ async def auth(request: Request, oidc_provider_id: str) -> RedirectResponse:
) )
@app.get("/account")
async def account(
request: Request,
oidc_provider: Annotated[StarletteOAuth2App, Depends(get_oidc_provider)],
) -> RedirectResponse:
if (
provider := providers_settings.get(request.session.get("oidc_provider_id", ""))
) is None:
raise HTTPException(
status.HTTP_406_NOT_ACCEPTABLE, detail="No oidc provider setting"
)
return RedirectResponse(f"{provider.url}/account")
@app.get("/logout") @app.get("/logout")
async def logout( async def logout(
request: Request, request: Request,

View file

@ -32,6 +32,7 @@ class OIDCProvider(BaseModel):
code_challenge_method: str | None = None code_challenge_method: str | None = None
hint: str = "No hint" hint: str = "No hint"
resources: list[Resource] = [] resources: list[Resource] = []
account_url_suffix: str | None = None
@computed_field @computed_field
@property @property
@ -43,6 +44,14 @@ class OIDCProvider(BaseModel):
def token_url(self) -> str: def token_url(self) -> str:
return "auth/" + self.id return "auth/" + self.id
@computed_field
@property
def account_url(self) -> str | None:
if self.account_url_suffix:
return self.url + self.account_url_suffix
else:
return None
class ResourceProvider(BaseModel): class ResourceProvider(BaseModel):
id: str id: str

View file

@ -1,6 +1,6 @@
<html> <html>
<head> <head>
<title>FastAPI OIDC test</title> <title>OIDC (FastAPI) test</title>
<link href="{{ url_for('static', path='/styles.css') }}" rel="stylesheet"> <link href="{{ url_for('static', path='/styles.css') }}" rel="stylesheet">
<script src="{{ url_for('static', path='/utils.js') }}"></script> <script src="{{ url_for('static', path='/utils.js') }}"></script>
</head> </head>

View file

@ -42,7 +42,10 @@
<span>Provider:</span> <span>Provider:</span>
{{ user.oidc_provider.name }} {{ user.oidc_provider.name }}
</div> </div>
<a href="logout" class="logout">Logout</a> {% if oidc_provider_settings.account_url %}
<button onclick="location.href='{{ oidc_provider_settings.account_url }}'" class="logout">Account</button>
{% endif %}
<button onclick="location.href='{{ request.url_for("logout") }}'" class="logout">Logout</button>
</div> </div>
{% endif %} {% endif %}
<hr> <hr>
@ -66,7 +69,7 @@
</p> </p>
<div class="links-to-check"> <div class="links-to-check">
{% for resource in resources %} {% for resource in resources %}
<a href="{{ request.url_for("get_resource", id=resource.id) }}">{{ resource.name }}</a> <a href="{{ request.url_for('get_resource', id=resource.id) }}">{{ resource.name }}</a>
{% endfor %} {% endfor %}
</div> </div>
{% endif %} {% endif %}