2016-07-13 11 views
1

Ich bin mit Token-Authentifizierung innerhalb meiner app die magento API zuzugreifen. Ich mache das folgende Setup in Postbote und es funktioniert gut: enter image description hereMagento 2 Token Auth - 400 Fehler/CORS Ausgabe

jedoch jQuery Post mit ich konsequent einen 400-Fehler zurück, da es nicht HTTP-Verb OPTIONS für Preflight scheint zu unterstützen (Ich habe eine CORS Config für nginx). Ich habe versucht:

Ich habe auch JSON.Stringify um das Objekt versucht. Warum funktioniert es im Postboten, aber in xhr bekomme ich ständig einen 400 Fehler? Außerdem löst diese Anfrage eine weitere Anfrage nach einem GET mit einem Fehler aus. Einige meiner $ .post dies in der Konsole verursacht:

enter image description here

Hier einige cURL Antworten:

curl -H "Origin: http://localhost:4200" \ 
    -H "Access-Control-Request-Method: POST" \ 
    -H "Access-Control-Request-Headers: X-Requested-With" \ 
    -d '{"username": "ember-app", "password": "ember-app2"}'\ 
    -X OPTIONS --verbose https://myhost/index.php/rest/V1/integration/admin/token 

eine Antwort gibt, das ist:

{"message":"Request method is invalid."} 

Gleiche mit:

curl -H "Origin: http://localhost:4200" \ 
    -H "Access-Control-Request-Method: POST" \ 
    -H "Access-Control-Request-Headers: X-Requested-With" \ 
    -X OPTIONS --verbose https://myhost/index.php/rest/V1/integration/admin/token?username=ember-app&password=ember-app2 

jedoch eine normale curl Post tun funktioniert:

curl -H "Content-Type: application/json" -X POST -d '{"username":"ember-app","password":"ember-app2"}' https://myhos/index.php/rest/V1/integration/admin/token 
+0

Außerdem '$ .post ('myip/index.php/rest/V1/Integration/admin/Token? Username = glut-app & password = glut-app2', function (Antwort) { console.log (Antwort); }); 'gibt mir eine 200, aber alle oben genannten Methoden lösen auch einen GET auf der URL aus, die einen CORS-Fehler zurückgibt – rickyduck

+0

Können Sie Ihre CORS-Konfiguration für Nginx auch bitte teilen? – HiDeo

Antwort

4

Ein Antrag als Quer Herkunft HTTP-Anforderung identifiziert wird, wenn es eine Ressource aus einer anderen Domäne als der anfordert, die die erste Ressource dient. Aus Sicherheitsgründen sind URL-übergreifende HTTP-Anfragen, die von Skripten aus initiiert werden, in Browsern eingeschränkt.

Die Cross-Origin Resource Sharing (CORS) -Mechanismus von der W3C definiert einen Standard-Server, die Zugriffskontrollen domänenübergreifende Netz geben, die eine sichere domänenübergreifende Datenübertragungen ermöglichen. Es funktioniert, indem neue HTTP-Header hinzugefügt werden, die es den Servern ermöglichen, die Menge der Ursprünge zu definieren, die über einen Webbrowser auf diese Informationen zugreifen dürfen.

Zusätzlich werden einige HTTP-Anforderungen standardmäßig nicht sicher angesehen, wenn sie Benutzerdaten ändern können. Diese Anfragen sind automatisch Preflight in Webbrowsern. Das heißt, bevor eine Anfrage gesendet wird, eine Preflight Anfrage mit dem OPTIONS Verb wird vom Browser auf den anderen Domänenserver um, ob die tatsächliche Anforderung sicher zu bestimmen, gesendet werden soll oder nicht senden. Nach Genehmigung durch den Server wird die tatsächliche Anfrage gesendet.

Wenn Sie Postman verwenden, Ihre tatsächliche Anforderung wird gesendet und das ist es. Kein CORS-Schutz oder irgendetwas, Postman ist kein Webbrowser. Es funktioniert einfach.

Wenn Sie jQuery verwenden, um einen AJAX-Aufruf in einem Skript von Ihrem Webbrowser auszuführen, entspricht dies dem CORS-Standard und die Markierung Ihrer Anforderung ist unsicher. Das bedeutet, dass es Preflight sein sollte. Es sendet dann eine erste Anfrage an Ihren Server mit der OPTIONS Methode, um zu überprüfen, ob Ihre tatsächliche Anfrage sicher ist. Diese Anfragen müssen auf Ihrem Webserver erlaubt sein (was Nginx zu sein scheint).

Sie können this example auf überprüfen, wie CORS auf Nginx zu ermöglichen, und vielleicht ist es mit Ihrer aktuellen Konfiguration vergleichen.Eine grundlegende aufgerissenen Konfiguration wäre (ich einige Kommentare hinzugefügt):

location/{ 
    // OPTIONS requests. 
    if ($request_method = 'OPTIONS') { 
    // URI that may access the resource. 
    add_header 'Access-Control-Allow-Origin' '*'; 

    // Methods allowed when accessing the resource. 
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; 

    // Headers that can be used when making the actual request. 
    add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; 

    // Cache the preflight result for 20 day. 
    add_header 'Access-Control-Max-Age' 1728000; 

    add_header 'Content-Type' 'text/plain charset=UTF-8'; 
    add_header 'Content-Length' 0; 

    return 204; 
    } 

    // POST requests. 
    if ($request_method = 'POST') { 
    // URI that may access the resource. 
    add_header 'Access-Control-Allow-Origin' '*'; 

    // Methods allowed when accessing the resource. 
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; 

    // Headers that can be used when making the actual request. 
    add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; 
    } 

    // GET requests 
    if ($request_method = 'GET') { 
    // URI that may access the resource. 
    add_header 'Access-Control-Allow-Origin' '*'; 

    // Methods allowed when accessing the resource. 
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; 

    // Methods allowed when accessing the resource. 
    add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; 
    } 
} 

Wenn alles auf der Server-Seite in Ordnung ist, sollten Sie Ihren jQuery Wunsch anpassen zu entsprechen, was auf dem Server erwartet wird.

jQuery.ajax({ 
    url: 'https://host/rest/V1/integration/admin/token', 
    data: JSON.stringify({"username": "ember-app", "password": "ember-app2"}), 
    contentType: "application/json", 
    method: 'POST' 
}).done((response) => { 
    alert(response); 
}) 
+0

danke für deine antwort. Das ist die genaue Konfiguration, die ich für nginx verwendet habe. Tatsächlich funktioniert eine CORS-Anfrage an andere Teile der API einwandfrei (zum Beispiel '/ rest/V1/guest-carts /' funktioniert absolut gut. – rickyduck

+0

Verwenden alle API-Endpunkte https (zum Beispiel 'https: // myhost/index.php/rest/V1/guest-carts/'oder nur die Endpunkte in Bezug auf Authentifizierung? – HiDeo

+0

Sie alle verwenden HTTPS. Wenn wir einen Chat einrichten, kann ich Ihnen die URL geben, damit Sie es selbst sehen können – rickyduck

0

Es sieht so aus, als ob der CORS-Fehler in diesem Fall ein Hering ist.

Sie erwähnen den Magento-Endpunkt /V1/integration/admin/token, der für die Token-Generierung verwendet wird.

Sie müssen dies nicht in Ihrer App verwenden.

Stattdessen kann dies ein mehrstufiger Prozess sein.

  1. Generieren Sie das Token http://devdocs.magento.com/guides/v2.0/get-started/authentication/gs-authentication-token.html#auth-request

  2. Shop das Token in einer Konfigurationsdatei

  3. Für jede Web-API-Anfrage geben Sie die Token in den Authorization Request-Header mit dem Schema Bearer HTTP Autorisierung. http://devdocs.magento.com/guides/v2.0/get-started/authentication/gs-authentication-token.html#web-api-access

0

Fügen Sie unter Linien in Magento .htaccess-Datei, die in dem Stammordner von Magento. Es hat für mich funktioniert.

Header always set Access-Control-Allow-Origin "*" 
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT" 
Header always set Access-Control-Max-Age "1000" 
Header always set Access-Control-Allow-Headers "x-requested-with, Content-Type, origin, authorization, accept, client-security-token" 

# Added a rewrite to respond with a 200 SUCCESS on every OPTIONS request. 
RewriteEngine On 
RewriteCond %{REQUEST_METHOD} OPTIONS 
RewriteRule ^(.*)$ $1 [R=200,L]