Skip to content

Problème de Redirection Post-Login Better Auth & Starlight

Problème de Redirection Post-Login Better Auth & Starlight

Document d'analyse et de résolution des redirections et configurations CI/CD pour Starlight & Better Auth.

1. Description du Problème Initial

Lors de la sécurisation des documentations Starlight (/docs/ et /gettingstarted/) avec Better Auth sur Cloudflare Workers (Astro SSR) :

  1. Après une saisie correcte des identifiants sur /login, le serveur renvoyait un succès HTTP, mais l’utilisateur était immédiatement redirigé à nouveau vers /login.
  2. Après l’application d’un build SSR, l’accès à la route /docs retournait parfois une page 404 Not Found ou un message Page not found au lieu du portail Starlight.
  3. Le cookie de session n’était pas correctement validé lors des requêtes ultérieures du middleware onRequest.

2. Diagnostics et Causes Racines Identifiées

Cause Racine 1 : Pré-rendu statique Starlight (prerender: true par défaut)

  • Diagnostic : Par défaut, le plugin Astro @astrojs/starlight génère toutes ses pages de documentation de manière statique au build (prerender: true).
  • Impact : En mode statique, les middlewares Astro (onRequest) ne s’exécutent jamais à la demande lors des requêtes HTTP des visiteurs. Seules les requêtes dynamiques déclenchent le middleware.
  • Solution : Ajouter l’option prerender: false dans la configuration Starlight (apps/web/astro.config.mjs).

Cause Racine 2 : Navigation côté Client post-authentification AJAX

  • Diagnostic : L’appel client authClient.signIn.email(...) effectue une requête AJAX (fetch) asynchrone qui renvoie les cookies HTTP Set-Cookie dans la réponse.
  • Impact : En l’absence d’une instruction explicite de redirection du navigateur, la page /login restait figée.
  • Solution : Ajouter window.location.href = callbackURL; dans le callback onSuccess du formulaire client (src/pages/login.astro).

Cause Racine 3 : Priorité des routes dynamiques Astro ([slug].astro vs Integrations)1/2

  • Diagnostic : Astro évalue le fichier src/pages/[slug].astro avant les routes dynamiques des intégrations pour les chemins à segment unique comme /docs ou /gettingstarted.
  • Impact : [slug].astro interrogeait Sanity pour un slug docs ou gettingstarted. Ne le trouvant pas, il renvoyait une réponse HTTP 200 contenant un composant HTML <p>Page not found</p>. Comme Astro recevait une réponse HTTP 200 de la route [slug].astro, Starlight n’était jamais invoqué.

Cause Racine 3 : Priorité des routes dynamiques Astro ([slug].astro vs Integrations)2/2

  • Solution :
    1. Dans src/pages/[slug].astro, déclarer une liste de slugs réservés (['docs', 'gettingstarted', 'getting-started']) et renvoyer immédiatement new Response(null, { status: 404 }) pour céder la main à Starlight.
    2. Dans src/middleware.ts, imposer une redirection avec slash final (/docs $\rightarrow$ /docs/) pour isoler les routes de documentation.

Cause Racine 4 : Incompatibilité WASM (satteri) sous Rolldown / Vite Cloudflare

  • Diagnostic : Starlight dépend de modules WASM (@bruits/satteri-wasm32-wasi) pour le traitement HTML/Markdown.
  • Impact : Le bundling Vite/Rolldown sous Cloudflare Workers échouait à résoudre les bindings WASM natifs en mode SSR Worker.
  • Solution : Configurer un alias de replacement dans apps/web/astro.config.mjs redirigeant satteri vers un stub JS minimal src/lib/empty.js.
  • Diagnostic : L’option cookiePrefix: "amn-auth" sur la configuration serveur de Better Auth différait des attentes du client JavaScript SDK.
  • Impact : Le cookie sauvegardé sur le navigateur (better-auth.session_token) n’était pas relu correctement sous le préfixe custom.
  • Solution : Retirer cookiePrefix pour utiliser le standard better-auth.session_token.

3. Matrice des Secrets GitHub Actions à Créer

Pour garantir un déploiement continu fluide via GitHub Actions (deploy-dev.yml et deploy-prod.yml), les secrets suivants doivent être créés sous votre dépôt GitHub (Repository Settings > Secrets and variables > Actions).

A. Secrets Globaux / Niveaux Environnements (dev et prod)1/2

Nom du Secret Description Exemple Valeur (Dev) Exemple Valeur (Prod)
BETTER_AUTH_SECRET Clé secrète de chiffrement des tokens de session (min 32 car.) udfbrVep4LgM5+CzBq... <generer-un-secret-32-caracteres-aleatoire>
BETTER_AUTH_URL URL de base de l’application Web pour le callback auth https://amn-dev.anderson-metsanou.workers.dev https://amn-prod.anderson-metsanou.workers.dev
BETTER_AUTH_TRUSTED_ORIGINS Liste des origines autorisées séparées par des virgules http://localhost:4321,http://localhost:8787,https://amn-dev.anderson-metsanou.workers.dev https://amn-prod.anderson-metsanou.workers.dev,https://votre-domaine.com
SANITY_PROJECT_ID Identifiant du projet Sanity 4wa7mvsz 4wa7mvsz
SANITY_DATASET Dataset Sanity cible development production

A. Secrets Globaux / Niveaux Environnements (dev et prod)2/2

Nom du Secret Description Exemple Valeur (Dev) Exemple Valeur (Prod)
SANITY_API_READ_TOKEN Token Sanity en lecture seule sk... sk...
SANITY_API_WRITE_TOKEN Token Sanity en écriture sk... sk...
SANITY_PREVIEW_SECRET Secret pour le mode Preview Visual Editing qAtVN1K7... qAtVN1K7...
CLOUDFLARE_ACCOUNT_ID Account ID Cloudflare <votre-account-id> <votre-account-id>
CLOUDFLARE_API_TOKEN API Token Cloudflare avec accès Workers & D1 <votre-api-token> <votre-api-token>

4. Workflows GitHub Actions mis à jour

Les fichiers .github/workflows/deploy-dev.yml, .github/workflows/deploy-prod.yml, et .github/workflows/redeploy-secrets.yml ont été mis à jour pour :

  1. Injecter BETTER_AUTH_SECRET, BETTER_AUTH_URL, et BETTER_AUTH_TRUSTED_ORIGINS dans les variables de Build ($GITHUB_ENV).
  2. Exécuter npx wrangler secret put pour provisionner directement les secrets de runtime dans les Cloudflare Workers apps/web et services/submission-processor.
Switch to normal mode

Contents