Problème de Redirection Post-Login Better Auth & Starlight
1. Description du Problème Initial
Section titled “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) :
- 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. - Après l’application d’un build SSR, l’accès à la route
/docsretournait parfois une page404 Not Foundou un messagePage not foundau lieu du portail Starlight. - 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
Section titled “2. Diagnostics et Causes Racines Identifiées”Cause Racine 1 : Pré-rendu statique Starlight (prerender: true par défaut)
Section titled “Cause Racine 1 : Pré-rendu statique Starlight (prerender: true par défaut)”- Diagnostic : Par défaut, le plugin Astro
@astrojs/starlightgé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: falsedans la configuration Starlight (apps/web/astro.config.mjs).
Cause Racine 2 : Navigation côté Client post-authentification AJAX
Section titled “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
/loginrestait figée. - Solution : Ajouter
window.location.href = callbackURL;dans le callbackonSuccessdu formulaire client (src/pages/login.astro).
Cause Racine 3 : Priorité des routes dynamiques Astro ([slug].astro vs Integrations)
Section titled “Cause Racine 3 : Priorité des routes dynamiques Astro ([slug].astro vs Integrations)”- Diagnostic : Astro évalue le fichier
src/pages/[slug].astroavant les routes dynamiques des intégrations pour les chemins à segment unique comme/docsou/gettingstarted. - Impact :
[slug].astrointerrogeait Sanity pour un slugdocsougettingstarted. 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é. - Solution :
- Dans
src/pages/[slug].astro, déclarer une liste de slugs réservés (['docs', 'gettingstarted', 'getting-started']) et renvoyer immédiatementnew Response(null, { status: 404 })pour céder la main à Starlight. - Dans
src/middleware.ts, imposer une redirection avec slash final (/docs$\rightarrow$/docs/) pour isoler les routes de documentation.
- Dans
Cause Racine 4 : Incompatibilité WASM (satteri) sous Rolldown / Vite Cloudflare
Section titled “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.mjsredirigeantsatterivers un stub JS minimalsrc/lib/empty.js.
Cause Racine 5 : Nommage & Scope du Cookie de Session
Section titled “Cause Racine 5 : Nommage & Scope du Cookie de Session”- 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
cookiePrefixpour utiliser le standardbetter-auth.session_token.
3. Matrice des Secrets GitHub Actions à Créer
Section titled “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)
Section titled “A. Secrets Globaux / Niveaux Environnements (dev et prod)”| 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 |
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
Section titled “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 :
- Injecter
BETTER_AUTH_SECRET,BETTER_AUTH_URL, etBETTER_AUTH_TRUSTED_ORIGINSdans les variables de Build ($GITHUB_ENV). - Exécuter
npx wrangler secret putpour provisionner directement les secrets de runtime dans les Cloudflare Workersapps/webetservices/submission-processor.