Type de ressource : Route Astro (Endpoint API)
Fichier source :src/pages/api/preview.ts
Statut : Actif
1. Vue dâensemble
Section titled â1. Vue dâensembleâ1.1. Description
Section titled â1.1. DescriptionâEndpoint API pour activer le mode preview Sanity. VĂ©rifie le secret de preview, pose le cookie sanity-preview, et redirige vers la page demandĂ©e. UtilisĂ© par le Sanity Studio pour prĂ©visualiser les drafts.
1.2. Objectif
Section titled â1.2. Objectifâ- Activer le mode preview pour visualiser les drafts Sanity
- SĂ©curiser lâaccĂšs via un secret
- Protéger contre les redirections ouvertes (open-redirect)
- Rediriger vers la page demandée
1.3. Caractéristiques
Section titled â1.3. CaractĂ©ristiquesâ| PropriĂ©tĂ© | Valeur |
|---|---|
| URL publique | /api/preview |
| Mode de rendu | SSR |
| Type | Endpoint API (Redirect) |
| Méthode HTTP | GET |
| Authentification requise | Secret de preview |
| Cache | No-store |
2. Architecture et flux
Section titled â2. Architecture et fluxâ[RequĂȘte Sanity Studio] â âą secret + slug âŒ[Endpoint /api/preview] â âą VĂ©rification du secret â âą Sanitization du slug (open-redirect protection) â âą Pose du cookie sanity-preview âŒ[Redirect (307)] â âŒ[Page demandĂ©e (ex: /welcome)] â âą DĂ©tection du cookie âŒ[Rendu avec perspective previewDrafts]2.2. Composants impliquĂ©s
Section titled â2.2. Composants impliquĂ©sâ| Composant | RĂŽle | Couche |
|---|---|---|
api/preview.ts |
DĂ©finition de lâendpoint | L2 (Astro) |
| Sanity Studio | Déclencheur du preview | L1 (Sanity) |
| Pages avec preview | Consommatrices du cookie | L2 (Astro) |
3. Implémentation
Section titled â3. ImplĂ©mentationâ3.1. Code de lâendpoint
Section titled â3.1. Code de lâendpointâimport type { APIRoute } from 'astro';
export const prerender = false;
export const GET: APIRoute = async ({ request, cookies, redirect }) => { const url = new URL(request.url); const secret = url.searchParams.get('secret'); const slug = url.searchParams.get('slug') || '/welcome';
const expectedSecret = import.meta.env.SANITY_PREVIEW_SECRET || process.env.SANITY_PREVIEW_SECRET || '';
// Vérification du secret de prévisualisation if (!secret || secret !== expectedSecret) { return new Response('Jeton de prévisualisation invalide ou manquant.', { status: 401, }); }
// Protection contre la redirection ouverte (open-redirect) const sanitizedSlug = slug.startsWith('/') && !slug.startsWith('//') ? slug : '/welcome';
// Pose du cookie de preview cookies.set('sanity-preview', 'true', { path: '/', httpOnly: true, secure: true, sameSite: 'lax', maxAge: 3600, // 1 heure });
return redirect(sanitizedSlug, 307);};4. DonnĂ©es et requĂȘtes GROQ
Section titled â4. DonnĂ©es et requĂȘtes GROQâAucune requĂȘte GROQ nâest utilisĂ©e dans cet endpoint.
5. ParamĂštres et validation
Section titled â5. ParamĂštres et validationâ5.1. Query strings
Section titled â5.1. Query stringsâ| ParamĂštre | Type | Obligatoire | Description | Validation |
|---|---|---|---|---|
secret |
string |
â | Secret de preview | Doit correspondre Ă SANITY_PREVIEW_SECRET |
slug |
string |
â | Page Ă afficher | Sanitization contre open-redirect |
5.2. Gestion des erreurs
Section titled â5.2. Gestion des erreursâ| Code HTTP | Condition | RĂ©ponse |
|---|---|---|
| 307 | SuccĂšs | Redirect vers le slug |
| 401 | Secret invalide ou manquant | Message dâerreur |
6. Stratégie de cache
Section titled â6. StratĂ©gie de cacheâ6.1. En-tĂȘtes de cache
Section titled â6.1. En-tĂȘtes de cacheâ| Mode | Cache-Control |
Rationale |
|---|---|---|
| API (redirect) | Non configuré | à configurer (no-store recommandé) |
6.2. ImplĂ©mentation dans lâendpoint
Section titled â6.2. ImplĂ©mentation dans lâendpointâNon implĂ©mentĂ© - pas de headers de cache explicites.
7. SEO et métadonnées
Section titled â7. SEO et mĂ©tadonnĂ©esâNon applicable (endpoint API).
8. Composants UI utilisés
Section titled â8. Composants UI utilisĂ©sâAucun composant UI nâest utilisĂ© (endpoint API).
9. Sécurité
Section titled â9. SĂ©curitĂ©â9.1. AccĂšs et authentification
Section titled â9.1. AccĂšs et authentificationâ| Condition | Comportement |
|---|---|
| Secret valide | Activation du preview et redirect |
| Secret invalide | Erreur 401 |
9.2. Validation des entrées
Section titled â9.2. Validation des entrĂ©esâ- â Validation du secret de preview
- â Sanitization du slug contre open-redirect
- â Cookie httpOnly et secure
9.3. En-tĂȘtes de sĂ©curitĂ©
Section titled â9.3. En-tĂȘtes de sĂ©curitĂ©âNon implĂ©mentĂ© dans cet endpoint (Ă configurer via Middleware Cloudflare).
10. Débogage et troubleshooting
Section titled â10. DĂ©bogage et troubleshootingâ10.1. ProblĂšmes courants
Section titled â10.1. ProblĂšmes courantsâ| SymptĂŽme | Cause probable | Solution |
|---|---|---|
| Erreur 401 | Secret invalide | Vérifier SANITY_PREVIEW_SECRET |
| Redirect incorrect | Slug mal formé | Vérifier la sanitization du slug |
| Cookie non posé | Erreur de configuration | Vérifier les options du cookie |
10.2. Logs et monitoring
Section titled â10.2. Logs et monitoringâ# Logs de dĂ©veloppementnpm run dev
# Logs Cloudflare (production)wrangler tail10.3. Tests manuels
Section titled â10.3. Tests manuelsâ# Test de l'endpoint en localcurl "http://localhost:4321/api/preview?secret=YOUR_SECRET&slug=/welcome"
# Test avec secret invalidecurl "http://localhost:4321/api/preview?secret=INVALID&slug=/welcome"# Attendu : 40111. Bonnes pratiques
Section titled â11. Bonnes pratiquesâ11.1. Architecture
Section titled â11.1. Architectureâ- â Validation stricte du secret
- â Protection contre open-redirect
- â Cookie sĂ©curisĂ© (httpOnly, secure, sameSite)
- â TTL limitĂ© (1 heure)
11.2. Performance
Section titled â11.2. Performanceâ- â Redirect 307 (temporary)
- â Pas de traitement lourd
11.3. Maintenance
Section titled â11.3. Maintenanceâ- â Rotation rĂ©guliĂšre du secret de preview
- â VĂ©rifier la configuration du sanity.config.ts
12. Ăvolutions et roadmap
Section titled â12. Ăvolutions et roadmapâ12.1. AmĂ©liorations planifiĂ©es
Section titled â12.1. AmĂ©liorations planifiĂ©esâ- Configuration des headers de cache (no-store)
- Logging des activations de preview
12.2. Limitations connues
Section titled â12.2. Limitations connuesâ- â Headers de cache non configurĂ©s
- â Pas de logging des activations
13. Ressources liées
Section titled â13. Ressources liĂ©esâ- Documentation Astro : Endpoints
- Documentation Sanity : Preview Content
- Fichiers concernés :
src/pages/api/preview.tsapps/studio/sanity.config.ts(productionUrl).env(SANITY_PREVIEW_SECRET)
14. Historique des modifications
Section titled â14. Historique des modificationsâ| Date | Version | Description | Auteur |
|---|---|---|---|
| 2026-09-15 | 1.0 | Création initiale | Devin |