Remarque sur le mod : cette question concerne les raisons pour lesquelles Postman n'est pas soumis aux restrictions CORS de la même manière qu'un XMLHttpRequest. Cette question n'est pas sur la façon de corriger une erreur «Pas de« contrôle d'accès-autorisation-origine »...».
Veuillez arrêter de publier :
- Configurations CORS pour chaque langage / framework sous le soleil. Au lieu de cela, trouvez la question de votre langage / cadre pertinent .
- Services tiers qui permettent à une demande de contourner CORS
- Options de ligne de commande pour désactiver CORS pour divers navigateurs
J'essaie de faire une autorisation en utilisant JavaScript en me connectant au flacon intégré de l' API RESTful . Cependant, lorsque je fais la demande, j'obtiens l'erreur suivante:
XMLHttpRequest ne peut pas charger http: // myApiUrl / login . Aucun en-tête «Access-Control-Allow-Origin» n'est présent sur la ressource demandée. L'origine 'null' n'est donc pas autorisée à accéder.
Je sais que l'API ou la ressource distante doit définir l'en-tête, mais pourquoi cela a-t-il fonctionné lorsque j'ai fait la demande via l'extension Chrome Postman ?
Voici le code de demande:
$.ajax({
type: "POST",
dataType: 'text',
url: api,
username: 'user',
password: 'pass',
crossDomain : true,
xhrFields: {
withCredentials: true
}
})
.done(function( data ) {
console.log("done");
})
.fail( function(xhr, textStatus, errorThrown) {
alert(xhr.responseText);
alert(textStatus);
});
Réponses:
Si j'ai bien compris, vous effectuez une requête XMLHttpRequest vers un domaine différent de celui de votre page. Le navigateur le bloque donc car il autorise généralement une demande de la même origine pour des raisons de sécurité. Vous devez faire quelque chose de différent lorsque vous souhaitez effectuer une demande interdomaine. Un tutoriel sur la façon d'y parvenir utilise CORS .
Lorsque vous utilisez Postman, ils ne sont pas limités par cette politique. Extrait de Cross-Origin XMLHttpRequest :
la source
C'est très simple à résoudre si vous utilisez PHP . Ajoutez simplement le script suivant au début de votre page PHP qui gère la requête:
Si vous utilisez Node-red, vous devez autoriser CORS dans le
node-red/settings.js
fichier en supprimant les commentaires des lignes suivantes:Si vous utilisez Flask identique à la question; vous devez d'abord installer
flask-cors
Incluez ensuite les cors Flask dans votre application.
Une application simple ressemblera à:
Pour plus de détails, vous pouvez consulter la documentation de Flask .
la source
Parce que
$ .ajax ({type: "POST" - appelle OPTIONS
$ .post ( - Appelle POST
Les deux sont différents. Postman appelle correctement "POST", mais lorsque nous l'appellerons, ce sera "OPTIONS".
Pour les services Web C # - API Web
Veuillez ajouter le code suivant dans votre fichier web.config sous la balise <system.webServer>. Cela fonctionnera:
Veuillez vous assurer que vous ne faites aucune erreur dans l'appel Ajax
jQuery
Note: Si vous cherchez le téléchargement de contenu à partir d' un site Web tiers alors cela ne vous aidera pas . Vous pouvez essayer le code suivant, mais pas JavaScript.
la source
*
utiliserhttps://www.myotherdomain.com
L'application d'une restriction CORS est une fonctionnalité de sécurité définie par un serveur et implémentée par un navigateur .
Cependant, l'outil Postman ne se soucie pas de la stratégie CORS du serveur.
C'est pourquoi l'erreur CORS apparaît dans le navigateur, mais pas dans Postman.
la source
Dans l'enquête ci-dessous en tant qu'API, j'utilise http://example.com au lieu de http: // myApiUrl / login à partir de votre question, car cette première fonctionne.
Je suppose que votre page est sur http: //my-site.local: 8088 .
La raison pour laquelle vous voyez des résultats différents est que Postman:
Host=example.com
(votre API)Origin
Ceci est similaire à la façon dont les navigateurs envoient des demandes lorsque le site et l'API ont le même domaine (les navigateurs définissent également l'élément d'en-tête
Referer=http://my-site.local:8088
, mais je ne le vois pas dans Postman). Lorsque l'en-Origin
tête n'est pas défini, les serveurs autorisent généralement de telles demandes par défaut.C'est la manière standard dont Postman envoie les demandes. Mais un navigateur envoie des demandes différemment lorsque votre site et votre API ont des domaines différents , puis CORS se produit et le navigateur automatiquement:
Host=example.com
(le vôtre comme API)Origin=http://my-site.local:8088
(votre site)(L'en-tête
Referer
a la même valeur queOrigin
). Et maintenant, dans l' onglet Console et réseaux de Chrome, vous verrez:Lorsque vous disposez de
Host != Origin
CORS, et lorsque le serveur détecte une telle demande, il la bloque généralement par défaut .Origin=null
est défini lorsque vous ouvrez du contenu HTML à partir d'un répertoire local et envoie une demande. La même situation se produit lorsque vous envoyez une demande à l'intérieur d'un<iframe>
, comme dans l'extrait ci-dessous (mais ici l'en-Host
tête n'est pas défini du tout) - en général, partout où la spécification HTML dit origine opaque, vous pouvez traduire cela enOrigin=null
. Vous trouverez plus d'informations à ce sujet ici .Si vous n'utilisez pas une simple demande CORS, généralement le navigateur envoie automatiquement une demande OPTIONS avant d'envoyer la demande principale - plus d'informations sont ici . L'extrait ci-dessous le montre:
Vous pouvez modifier la configuration de votre serveur pour autoriser les requêtes CORS.
Voici un exemple de configuration qui active CORS sur nginx (fichier nginx.conf) - soyez très prudent avec le réglage
always/"$http_origin"
pour nginx et"*"
pour Apache - cela débloquera CORS de n'importe quel domaine.Afficher l'extrait de code
Voici un exemple de configuration qui active CORS sur Apache (fichier .htaccess)
Afficher l'extrait de code
la source
Rencontré la même erreur dans différents cas d'utilisation.
Cas d'utilisation: en chrome lorsque vous essayez d'appeler le point final Spring REST en angulaire.
Solution: ajoutez une annotation @CrossOrigin ("*") au-dessus de la classe de contrôleur respective.
la source
Si vous utilisez .NET comme niveau intermédiaire, vérifiez clairement l'attribut de route, par exemple,
J'ai eu un problème quand c'était comme ça,
Fixé par cela,
la source
Uniquement pour le projet d'API Web .NET Core, ajoutez les modifications suivantes:
services.AddMvc()
ligne dans laConfigureServices()
méthode du fichier Startup.cs:app.UseMvc()
ligne dans laConfigure()
méthode du fichier Startup.cs:la source