2015-12-23 7 views
8

arbeitet Ich versuche, von meinem Winkel Login Service POST:Angular POST Quer Herkunft Fehler beim POSTMAN

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

Und ich bekomme diese Fehlermeldung:

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. 

ich diese Header versucht:

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

Und auch diese:

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

Das Interessante ist, dass der POSTMAN funktioniert. Was soll ich tun?

Danke.

+0

Haben Sie CORS auf Ihrem Server aktiviert? Weitere Informationen finden Sie unter http://enable-cors.org/ – heavyhorse

+0

Hey. Es ist nicht mein Server, es ist ein externer Dienst. Ich nehme an, cors sind aktiviert, weil ich eine Antwort von POSTMAN bekommen kann – user3712353

+1

POSTMAN führt keinen normalen Webkontext aus und unterliegt nicht der gleichen Ursprungsrichtlinie. Siehe [Wie wirkt sich die gleiche Ursprungsrichtlinie auf Browsererweiterungen aus?] (Http://stackoverflow.com/questions/11849945/how-does-same-origin-policy-apply-to-browser-extensions/11850557#11850557) – apsillers

Antwort

5

Ihre Anfrage enthält nicht einfache Header Content-type und signature, die in den Header der Antwort Access-Control-Allow-Headers enthalten sein müssen.

(Content-type ist manchmal ein einfacher Kopf, sondern nur für bestimmte Werte. application/json nicht einer dieser Werte ist, und es verursacht Content-type nicht einfach zu werden.)

hinzufügen Content-type-Access-Control-Allow-Headers in Ihren Server-Preflight-Antwort .

POSTMAN ist nicht an die Richtlinie für denselben Ursprung gebunden, daher ist keine CORS-Unterstützung vom Server erforderlich.

+0

interessant Danke für diese Einsicht, in diesem Fall ist auch ein Eintrag zur Unterschrift nötig? – danday74

+0

Immer noch das Gleiche. Ich habe das zu meiner eckigen App config hinzugefügt: '$ httpProvider.defaults.useXDomain = true; löschen $ httpProvider.defaults.headers.common ['X-Requested-With']; $ httpProvider.defaults.headers.common ['Zugriffskontrolle-Zulassen-Header'] = '*'; $ httpProvider.defaults.headers.common ['Access-Control-Allow-Origin'] = '*'; $ httpProvider.defaults.headers.common ['Access-Control-Erlauben-Methoden'] = '*'; ' – user3712353

+0

@ user3712353 Oh, ich nahm an, dass die späteren Code-Snippets auf Ihrem serverseitigen Code ausgeführt wurden. Sie müssen den * Server * korrekte CORS-Header senden lassen. – apsillers

2

Sendet Ihr Browser vor dem POSTING eine OPTIONS-Anfrage? überprüfen Sie die NET Tab ich Probleme habe vor, wo eine OPTIONS-Anforderung durch den Browser oder Angular gemacht wurde (nicht wissen, welche) und der Server nicht über ...

„Access-Control-Allow -Methoden ":" GET, POST "," PUT "," DELETE "," OPTIONEN ";

+0

Hey. Wie Sie sehen können, habe ich '*' für die Methoden hinzugefügt. Es funktioniert immer noch nicht. – user3712353

+0

OK in Ihrem Knoten-Code dump die Header, die POSTMAN verwendet und dump die Header von den Browsern verwendet und vergleichen Sie die beiden und versuchen, sie an die Konfiguration, die funktioniert! Ich würde die Angular-Header bekommen und sie auch in Postman verwenden und sehen, ob es fehlschlägt. Finden Sie heraus, welche Kopfzeile das Problem verursacht, indem Sie sie einzeln entfernen. Sie könnten einfach die Header von der NET-Registerkarte des Browsers abrufen und sie dann auf die POSTMAN-Anfrage kopieren und sie einzeln entfernen. – danday74

+0

Der Dienst, den ich anschliesse, gehört nicht mir, es ist ein externer Dienst zur Authentifizierung. Ich weiß nicht, was ich im Winkelcode ändern sollte, und ja, es sendet OPTIONS als Methode – user3712353

0

Nicht sicher, ob Sie bereits die Informationen haben, die Sie benötigen. Aber in meinem lokalen Web-Server - wenn ich eine HTTP-Anfrage mache mit Postbote hier ist, was es in den Header fügt hinzu:

Header: {host: 'localhost', Verbindung: 'keep-alive', Pragma : 'no-cache', 'Cache-Kontrolle': 'No-Cache', 'Benutzer-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, wie Gecko) Chrome/47.0 .2526.106 Safari/537,36' , akzeptieren: '/', referer: 'http://localhost/', 'accept-encoding': 'gzip, deflate, sdch', 'accept-language': ‚en-US, en; q = 0,8 '},

Und hier ist das, was ich in dem rawHeaders sehen: [ 'Host', 'localhost', 'Verbindung', 'keep-alive', 'Pragma', 'no-cache', ' Cache-Control ', ' No-Cache ', ' Benutzer-Agent ', ' Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537,36 (KHTML, wie Gecko) Chrome/47.0.2526.106 Safari/537.36' , 'Annehmen', '/' 'Referrer', 'http://localhost/' 'Accept-Encoding' 'gzip, abzulassen, SDCH', 'Accept-Language' " en-US, en; q = 0.8 '],

Also vielleicht müssen Sie nur Ihren Client fälschen, um ein anerkannter Browser-Client zu sein.

+0

Hey. Ich verstehe nicht, es sind die gleichen Header. – user3712353

+0

Was ich meine ist, ich denke, Sie müssen so etwas in Ihren Code einfügen: var headers = {host: 'localhost', verbindung: 'keep-alive', pragma: 'no-cache', 'cache-control' : 'no-cache', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, wie Gecko) Chrome/47.0.2526.106 Safari/537.36', accept: '/', Referer : 'http: // localhost /', 'accept-encoding': 'gzip, deflate, sdch', 'Sprache akzeptieren': 'en-US, en; q = 0.8 '}; var options = { host: localhost, Pfad: '/', port: '80', headers: headers }; var req = http.request (Optionen, Rückruf); – Tim

+0

Denken Sie, ich könnte das Problem gerade erkannt haben - ich habe gerade bemerkt, dass Sie versuchen, ssl/tls (durch https) zu verwenden. Ich glaube nicht, dass dies funktioniert, wenn Sie Angular JS aus einem Browser-Client, der auf andere Website verweist, verwenden. Ich glaube, das eine Sicherheitseinschränkung sein könnte: https://docs.angularjs.org/api/ng/service/$http#cross-site-request-forgery-xsrf-protection Wenn Sie versuchen, einen Beitrag an die gleiche Stelle auszuführen - Präfix es nicht mit dem vollständigen Domain/Host: https: // xyz/login nur den Pfad verwenden: "login /" oder "login" – Tim

Verwandte Themen