web-dev-qa-db-fra.com

Angular POST erreur croix Origine pendant que POSTMAN fonctionne

J'essaie de POST à partir de mon service de connexion angulaire:

$http.post('https://xyz/login',
            {
                headers: {
                    'Content-type': 'application/json',
                    'Accept': 'application/json',
                    'signature': 'asd'
                }

Et je reçois cette erreur:

XMLHttpRequest cannot load https://xyz/login. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:1337' is therefore not allowed access.

J'ai essayé ces en-têtes:

$httpProvider.defaults.useXDomain = true;
delete $httpProvider.defaults.headers.common['X-Requested-With'];

Et aussi ceux-ci:

"Access-Control-Allow-Origin": "*";
"Access-Control-Allow-Headers": "X-Requested-With";
"Access-Control-Allow-Methods": "GET, POST", "PUT", "DELETE";

La chose intéressante est que le POSTMAN fonctionne. Que dois-je faire?

Merci.

10
user3712353

Votre demande inclut des en-têtes non-simples Content-type et signature qui doivent être inclus dans l'en-tête Access-Control-Allow-Headers de la réponse.

(Content-type est parfois un simple en-tête, mais uniquement pour des valeurs particulières. application/json n'en fait pas partie et il en résulte que Content-type devient non simple.)

Ajoutez Content-type à Access-Control-Allow-Headers dans la réponse de contrôle en amont de votre serveur.

POSTMAN n'est pas lié par la politique de même origine, il n'a donc pas besoin de la prise en charge de CORS par le serveur.

6
apsillers

Votre navigateur fait-il une demande d’options avant de poster? Consultez l'onglet NET. J'ai déjà eu des problèmes où une requête OPTIONS était faite par le navigateur ou Angular (je ne sais pas lequel) et le serveur n'avait pas ...

"Méthodes d'accès de contrôle d'accès": "GET, POST", "PUT", "SUPPRIMER", "OPTIONS";

2
danday74

Je ne sais pas si vous avez déjà les informations dont vous avez besoin. Mais sur mon serveur Web local - lorsque je fais une requête http en utilisant postman, voici ce que cela ajoute à l'en-tête:

en-têtes: {Host: 'localhost', connexion: 'keep-alive', pragma: 'no-cache', 'cache-control': 'no-cache', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, comme Gecko) Chrome/47.0.2526.106 Safari/537.36 ', acceptez:'/', référent:' http: // localhost/ , 'accept-encoding': 'gzip, deflate, sdch', 'accept-language': 'en-US, en; q = 0,8'},

Et voici ce que je vois dans les rawHeaders: ['Host', 'localhost', 'Connection', 'Keep-Alive', 'Pragma', 'no-cache', 'Cache-Control', 'no-cache' , 'User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, comme Gecko) Chrome/47.0.2526.106 Safari/537.36', 'Accepter', '/' , 'Referer', ' http: // localhost/ ', 'Accept-Encoding', 'gzip, deflate, sdch', 'Accept-Language', 'en-US, en; q = 0,8'] ,

Alors peut-être avez-vous simplement besoin de simuler votre client pour qu'il soit un navigateur reconnu.

0
Tim