From 02228ba12313a84fe942146f4e454d8b18771587 Mon Sep 17 00:00:00 2001 From: Valentin ROBIN Date: Sun, 26 Jul 2026 22:32:42 +0200 Subject: [PATCH] =?UTF-8?q?Corrige=20l'=C3=A9tablissement=20de=20session?= =?UTF-8?q?=20depuis=20un=20lien=20d'invitation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Le lien d'invitation Supabase redirige avec les tokens dans le FRAGMENT d'URL (#access_token=...&refresh_token=...), jamais dans un paramètre ?code=. Un fragment n'est jamais envoyé au serveur par le navigateur (une route serveur ne peut donc pas le lire), et le client @supabase/ssr ne le détecte pas automatiquement (orienté sessions par cookies). /signup parse maintenant ce fragment et appelle auth.setSession() explicitement avant de vérifier l'utilisateur. Supprime la route src/app/auth/callback créée par erreur sur l'hypothèse d'un flux PKCE (?code=) qui ne correspond pas à ce que Supabase envoie réellement pour ce type de lien. Co-Authored-By: Claude Sonnet 5 --- src/app/signup/page.tsx | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/app/signup/page.tsx b/src/app/signup/page.tsx index b673698..8af6dde 100644 --- a/src/app/signup/page.tsx +++ b/src/app/signup/page.tsx @@ -35,6 +35,23 @@ export default function SignupPage() { useEffect(() => { async function checkInvite() { const supabase = createClient(); + + // Le lien d'invitation Supabase redirige avec les tokens dans le + // FRAGMENT d'URL (#access_token=...&refresh_token=...), jamais reçu + // par un serveur (le navigateur ne l'envoie jamais en HTTP) et pas + // auto-détecté par ce client (@supabase/ssr est orienté sessions par + // cookies) : on l'établit donc explicitement à la main, une fois. + const hash = window.location.hash; + if (hash.includes("access_token")) { + const params = new URLSearchParams(hash.slice(1)); + const access_token = params.get("access_token"); + const refresh_token = params.get("refresh_token"); + if (access_token && refresh_token) { + await supabase.auth.setSession({ access_token, refresh_token }); + } + window.history.replaceState(null, "", window.location.pathname); + } + const { data: { user }, } = await supabase.auth.getUser();