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:
claude BotandClaude Opus 5.5 committed 2026-10-08 08:21:57 +02:00
1 parent 80fd60d006
commit 7397f0f789
3 files changed
+396

No files matched your search

+35
View File
@@ -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>
);
}