Add user self-care link & setting for supporting providers
This commit is contained in:
parent
7ab715da5a
commit
dc93c7c05b
4 changed files with 33 additions and 5 deletions
src/oidc_test
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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 %}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue