mode: 'no-cors'
ne fera pas fonctionner les choses par magie. En fait, il aggrave les choses, car il a pour effet de dire aux navigateurs , "Empêcher mon code JavaScript frontal de regarder le contenu du corps de la réponse et des en-têtes en toutes circonstances." Bien sûr, vous ne voulez presque jamais ça.
Ce qui se passe avec les demandes d'origine croisée provenant du JavaScript frontal, c'est que les navigateurs bloquent par défaut le code frontal pour l'accès aux ressources d'origine croisée. Si Access-Control-Allow-Origin
est dans une réponse, alors les navigateurs relâcheront ce blocage et permettront à votre code d'accéder à la réponse.
Mais si un site n'envoie pas Access-Control-Allow-Origin
dans ses réponses, votre code frontal ne peut pas accéder directement aux réponses de ce site. En particulier, vous ne pouvez pas résoudre ce problème en spécifiant mode: 'no-cors'
(en fait, ce sera assurer votre code frontal ne peut pas accéder au contenu de la réponse).
Cependant, une chose que sera travail : si vous envoyez votre demande par un proxy CORS .
Vous pouvez également déployer facilement votre propre proxy sur Heroku en 2 ou 3 minutes seulement, à l'aide de 5 commandes :
git clone https://github.com/Rob--W/cors-anywhere.git
cd cors-anywhere/
npm install
heroku create
git push heroku master
Après avoir exécuté ces commandes, vous vous retrouverez avec votre propre serveur CORS Anywhere fonctionnant à l'adresse suivante, par exemple, https://cryptic-headland-94862.herokuapp.com/
.
Faites précéder l'URL de votre demande de l'URL de votre proxy ; par exemple :
https://cryptic-headland-94862.herokuapp.com/https://example.com
L'ajout de l'URL du proxy en tant que préfixe fait que la demande est effectuée par le biais de votre proxy qui, à son tour, fait le nécessaire :
- Transférer la demande à
https://example.com
.
- Reçoit la réponse de
https://example.com
.
- Ajoute le
Access-Control-Allow-Origin
dans la réponse.
- Transmet cette réponse, avec cet en-tête ajouté, au code frontal demandeur.
Le navigateur permet ensuite au code frontal d'accéder à la réponse, car cette réponse avec l'attribut Access-Control-Allow-Origin
L'en-tête de réponse est ce que le navigateur voit.
Cela fonctionne même si la requête déclenche un contrôle préalable CORS de la part des navigateurs. OPTIONS
car, dans ce cas, le proxy renvoie également la requête Access-Control-Allow-Headers
y Access-Control-Allow-Methods
les en-têtes nécessaires à la réussite du contrôle en amont.
Je peux atteindre ce point final, http://catfacts-api.appspot.com/api/facts?number=99
via Postman
https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS explique pourquoi, bien que vous puissiez accéder à la réponse avec Postman, les navigateurs ne vous laisseront pas accéder à la réponse par le biais d'un code JavaScript frontal s'exécutant dans une application Web, à moins que la réponse n'inclue une balise Access-Control-Allow-Origin
en-tête de réponse.
http://catfacts-api.appspot.com/api/facts?number=99 n'a pas Access-Control-Allow-Origin
de sorte qu'il n'y a aucun moyen pour votre code frontal d'accéder à la réponse en dehors de l'origine.
Votre navigateur peut recevoir la réponse sans problème et vous pouvez la voir dans Postman et même dans les outils de développement du navigateur, mais cela ne signifie pas que les navigateurs l'exposeront à votre code. Ils ne le feront pas, car il n'a pas de Access-Control-Allow-Origin
en-tête de réponse. Vous devez donc utiliser un proxy pour l'obtenir.
Le proxy envoie la demande à ce site, reçoit la réponse, ajoute le nom de l'utilisateur et le mot de passe. Access-Control-Allow-Origin
et tout autre en-tête CORS nécessaire, puis le renvoie à votre code demandeur. Et cette réponse avec l'en-tête Access-Control-Allow-Origin
ajouté est ce que le navigateur voit. Le navigateur laisse donc votre code frontal accéder à la réponse.
J'essaie donc de passer un objet à mon Fetch qui désactivera CORS.
Vous ne voulez pas faire ça. Pour être clair, lorsque vous dites que vous voulez "désactiver CORS", il semble que vous vouliez en fait désactiver les éléments suivants la politique de la même origine . CORS lui-même est en fait un moyen de le faire - CORS est un moyen d'assouplir la politique du "same-origin", pas un moyen de la restreindre.
Quoi qu'il en soit, il est vrai que vous pouvez - dans votre environnement local uniquement - faire des choses comme donner à votre navigateur des drapeaux d'exécution pour désactiver la sécurité et fonctionner de manière non sécurisée, ou vous pouvez installer une extension de navigateur localement pour contourner la politique de l'origine identique, mais tout cela ne fait que changer la situation juste pour vous localement.
Peu importe ce que vous modifiez localement, toute autre personne essayant d'utiliser votre application se heurtera toujours à la politique de l'origine identique, et il n'y a aucun moyen de la désactiver pour les autres utilisateurs de votre application.
Vous ne voudrez probablement jamais utiliser mode: 'no-cors'
en pratique, sauf dans quelques cas limités et encore, seulement si vous savez exactement ce que vous faites et quels en sont les effets. C'est parce que le réglage mode: 'no-cors'
dit en fait au navigateur est, "Empêcher mon code JavaScript frontal de regarder le contenu du corps de la réponse et des en-têtes en toutes circonstances." Dans la plupart des cas, ce n'est évidemment pas ce que vous voulez.
En ce qui concerne les cas où vous serait vous pouvez envisager d'utiliser mode: 'no-cors'
voir la réponse à l'adresse suivante Quelles sont les limitations applicables aux réponses opaques ? pour les détails. L'essentiel est que les cas sont :
-
Dans le cas limité où vous utilisez JavaScript pour placer du contenu provenant d'une autre origine dans un fichier de type <script>
, <link rel=stylesheet>
, <img>
, <video>
, <audio>
, <object>
, <embed>
ou <iframe>
(ce qui fonctionne parce que l'incorporation de ressources à travers l'origine est autorisée pour ces éléments) - mais pour une raison quelconque, vous ne voulez ou ne pouvez pas le faire simplement en faisant en sorte que le balisage du document utilise l'URL de la ressource comme l'élément href
o src
de l'élément.
-
Lorsque la seule chose que vous voulez faire avec une ressource est de la mettre en cache. Comme il est fait allusion dans la réponse Quelles sont les limitations applicables aux réponses opaques ? Dans la pratique, le scénario qui s'applique est celui où vous utilisez des Service Workers, auquel cas l'API pertinente est l'API API de stockage des caches .
Mais même dans ces cas limités, il faut être conscient de certains écueils importants ; voir la réponse à Quelles sont les limitations applicables aux réponses opaques ? pour les détails.
J'ai également essayé de passer dans l'objet { mode: 'opaque'}
Il n'y a pas mode: 'opaque'
mode de demande - opaque
est au contraire une simple propriété de l réponse et les navigateurs définissent cette propriété opaque sur les réponses aux demandes envoyées avec l'extension no-cors
mode.
Mais accessoirement, le mot opaque est un signal assez explicite sur la nature de la réponse que vous obtenez : "opaque" signifie que vous ne pouvez pas la voir.
1 votes
Cela répond-il à votre question ? Gérer la réponse - SyntaxError : Fin de saisie inattendue avec le mode : 'no-cors'.