Access to fetch at '...' from origin '...' has been blocked by CORS policyNo 'Access-Control-Allow-Origin' header is present on the requested resourceThe request works in curl and Postman but not in the browserIl est tentant d'y voir un problème de configuration : ajouter une origine et livrer la fonctionnalité. Mais réfléchissez à ce qu'implique un appel réussi depuis le navigateur. La clé circule dans un en-tête que les outils de développement de l'utilisateur affichent en entier. Elle est dans le bundle si vous l'y avez intégrée, et dans l'onglet réseau sinon. Quiconque ouvre la page la possède.
Les clés divulguées ainsi ne sont pas un risque théorique. Les moteurs de recherche de code public les font remonter en permanence, et une clé volée sur une API facturée au token se transforme directement en facture de quelqu'un d'autre sur votre compte. C'est pourquoi la plupart des fournisseurs fixent un allow-origin restrictif plutôt que * : ce n'est pas un oubli, c'est un refus délibéré.
Le modèle proxy tient en trois ou quatre lignes de code serveur : votre page appelle votre backend, votre backend détient la clé et appelle le fournisseur. Cela vous donne aussi l'endroit où placer des limites de débit et de dépenses par utilisateur, que vous voulez de toute façon.
Demandez à l'endpoint quelles origines il autorise réellement :
curl -s -I -X OPTIONS 'YOUR_BASE_URL/chat/completions' \
-H 'Origin: https://example.com' \
-H 'Access-Control-Request-Method: POST' \
| grep -i 'access-control'
Si Access-Control-Allow-Origin renvoie un domaine précis plutôt que *, les appels navigateur depuis votre origine ne fonctionneront pas, et aucune modification côté client n'y changera rien.
/api/chat sur votre propre domaine ; ce gestionnaire ajoute l'en-tête Authorization et transmet la requête. Aucun CORS en jeu, puisque le navigateur ne parle qu'à votre origine.NEXT_PUBLIC_, VITE_ et REACT_APP_ sont compilées dans le JavaScript que vous livrez. Une clé placée là est publiée, pas configurée.https://apiclan.us comme origine, délibérément : les clés sont faites pour vivre sur un serveur. La configuration de la base URL pour les clients côté serveur est dans le démarrage rapide.Dernière vérification le 2026-10-01. Rédigé à partir de problèmes diagnostiqués sur une passerelle compatible OpenAI en production, pas compilé à partir d'autres sites.