diff --git a/client/src/const.ts b/client/src/const.ts index 97b8d8b..68fbec9 100644 --- a/client/src/const.ts +++ b/client/src/const.ts @@ -11,8 +11,9 @@ export const getLoginUrl = () => "/login"; export const getOAuthLoginUrl = () => { const appId = import.meta.env.VITE_APP_ID; const portalUrl = import.meta.env.VITE_OAUTH_PORTAL_URL; - const currentUrl = window.location.href; + // Toujours rediriger vers /admin après OAuth + const redirectAfterAuth = `${window.location.origin}/admin`; const redirectUri = `${window.location.origin}/api/oauth/callback`; - const state = btoa(currentUrl); + const state = btoa(redirectAfterAuth); return `${portalUrl}?appId=${appId}&redirectUri=${encodeURIComponent(redirectUri)}&state=${encodeURIComponent(state)}&responseType=code`; }; diff --git a/server/_core/oauth.ts b/server/_core/oauth.ts index fd45373..0ae8313 100644 --- a/server/_core/oauth.ts +++ b/server/_core/oauth.ts @@ -44,7 +44,20 @@ export function registerOAuthRoutes(app: Express) { const cookieOptions = getSessionCookieOptions(req); res.cookie(COOKIE_NAME, sessionToken, { ...cookieOptions, maxAge: ONE_YEAR_MS }); - res.redirect(302, "/"); + // Décoder le state pour obtenir l'URL de redirection + let redirectUrl = "/"; + try { + redirectUrl = Buffer.from(state, 'base64').toString('utf-8'); + // Si c'est une URL complète, extraire seulement le path + if (redirectUrl.startsWith('http')) { + const url = new URL(redirectUrl); + redirectUrl = url.pathname; + } + } catch (error) { + console.warn("[OAuth] Failed to decode state, redirecting to /", error); + } + + res.redirect(302, redirectUrl); } catch (error) { console.error("[OAuth] Callback failed", error); res.status(500).json({ error: "OAuth callback failed" }); diff --git a/todo.md b/todo.md index 7876de3..6db74e4 100644 --- a/todo.md +++ b/todo.md @@ -298,3 +298,10 @@ - [x] Tester la connexion avec OAuth Manus - [x] Tester la connexion avec authentification locale - [x] Vérifier que les deux modes fonctionnent en production + +## Correction redirection OAuth + +- [x] Diagnostiquer pourquoi l'utilisateur est redirigé vers le tableau de bord Manus au lieu de l'application +- [x] Vérifier la configuration de redirectUri dans le flux OAuth +- [x] Corriger la redirection dans /api/oauth/callback pour revenir à l'application +- [x] Tester le flux OAuth complet (clic sur bouton → auth Manus → retour à l'application)