Authentification OIDC : package internal/auth et menu utilisateur
Suite du commit précédent : flux OIDC (découverte, PKCE, vérification de l'ID Token, groupes), sessions signées et bouton de déconnexion. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018GBsBpHJW7GxFDBV7z1zmo
This commit is contained in:
1 parent
80fd60d006
commit
7397f0f789
3 files changed
+396
No files matched your search
@@ -0,0 +1,35 @@
|
||||
import { useEffect, useState } from "react";
|
||||
import { api, type Me } from "./api";
|
||||
import { LogoutIcon } from "./icons";
|
||||
|
||||
interface Props {
|
||||
/** Appelé avant la déconnexion (enregistrement du schéma ouvert). */
|
||||
beforeLogout: () => Promise<unknown>;
|
||||
}
|
||||
|
||||
/** Utilisateur connecté et bouton de déconnexion (mode OIDC uniquement). */
|
||||
export function UserMenu({ beforeLogout }: Props) {
|
||||
const [me, setMe] = useState<Me | null>(null);
|
||||
|
||||
useEffect(() => {
|
||||
api
|
||||
.me()
|
||||
.then(setMe)
|
||||
.catch(() => setMe(null));
|
||||
}, []);
|
||||
|
||||
if (!me?.user || !me.logout) return null;
|
||||
const logout = me.logout;
|
||||
const who = me.user.email && me.user.email !== me.user.name ? `${me.user.name} (${me.user.email})` : me.user.name;
|
||||
|
||||
return (
|
||||
<button
|
||||
className="icon-btn"
|
||||
aria-label={`Se déconnecter (${who})`}
|
||||
title={`Connecté : ${who}\nCliquer pour se déconnecter`}
|
||||
onClick={() => beforeLogout().finally(() => location.assign(logout))}
|
||||
>
|
||||
<LogoutIcon />
|
||||
</button>
|
||||
);
|
||||
}
|
||||
Reference in new issue
Block a user