CORS et origines autorisees
Le CORS (Cross-Origin Resource Sharing) est le mecanisme qui autorise ou bloque les appels API depuis un navigateur. ZodBack gere le CORS a deux niveaux.
Niveau 1 : Middleware CORS (main.ts)
Le middleware NestJS CORS definit quelles origines peuvent appeler le backend.
Origines statiques (toujours autorisees)
Ces origines sont toujours acceptees, quel que soit le path :
FRONTEND_URL(ex:https://app.zoddev.site)PORTFOLIO_ORIGIN(si defini dans.env)127.0.0.1:3014(dev local)
Origines dynamiques (paths publics)
Pour les paths publics, toute origine est acceptee par le middleware CORS :
| Path pattern | Module |
|---|---|
/api/blog/v1/public/* |
Blog |
/api/portfolio/v1/public/* |
Portfolio |
/api/docs/v1/public/* |
Documentation |
Le middleware laisse passer la requete, mais la vraie validation se fait au niveau du guard.
Niveau 2 : ApiTokenGuard
Le guard valide le token et verifie les allowedOrigins configurees dans le token :
- Si le token a des
allowedOriginsdefinies et que le headerOriginne correspond pas → 403 Forbidden - Si le token n'a pas d'
allowedOrigins→ toute origine est acceptee (utile pour les tokens de test)
Ce que vous n'avez PAS besoin de modifier
Pour un site externe standard utilisant les endpoints publics existants (blog, portfolio, docs) :
- Pas de modification du backend — le CORS dynamique accepte deja toute origine sur les paths publics
- Pas de variable d'environnement a ajouter — sauf si vous voulez ajouter une origine statique
Ce que vous DEVEZ configurer
- Dans le token : renseignez les
Allowed Origins(ex:https://mon-blog.zoddev.site) pour securiser l'acces - Dans votre site : assurez-vous que les requetes partent bien du domaine declare
Erreurs CORS courantes
| Erreur | Cause | Solution |
|---|---|---|
CORS: origin header required in production |
Requete sans header Origin (ex: curl sans -H Origin) | Ajoutez -H "Origin: https://votre-domaine.com" |
Access-Control-Allow-Origin missing |
Le path n'est pas un path public reconnu | Verifiez le prefix du path (/api/.../v1/public/...) |
403 Forbidden |
L'origine n'est pas dans les allowedOrigins du token |
Mettez a jour les origines autorisees du token dans le dashboard |
CORS preflight failed |
Le serveur ne repond pas au OPTIONS | Verifiez que le backend est accessible et que le path existe |
Test CORS avec curl
# Simuler une requete navigateur avec Origin
curl -s "https://api.zoddev.site/api/blog/v1/public/posts" \
-H "x-api-key: <TOKEN>" \
-H "X-Project-Id: 1" \
-H "Origin: https://mon-blog.zoddev.site" \
-v 2>&1 | grep -i "access-control"
Si vous voyez Access-Control-Allow-Origin: https://mon-blog.zoddev.site, le CORS est correctement configure.