2017-07-06 2 views
0

Ich unterrichte mich Web-Dev und bin gerade dabei, XMLHttpRequests von einer Client-zugewandten Seite zu einem Express.js API-Backend zu senden. In diesem speziellen Fall verwende ich es, um Formulardaten zu übertragen und sie in einer Mongo-Datenbank zu speichern.Zugriff auf Ihre Backend-API ohne Verwendung von CORS

Das spezifische Problem, das ich habe, ist dies: Ich sende es codiert als application/json, die mir einen Cross-Origin-Fehler wirft, weil die Express.js API auf http://127.0.0.1:3000 ausgeführt wird. Ich verstehe, dass Anfragen an dieselbe Domäne, aber ein anderer Port diesen Fehler verursachen.

Ich habe in der Lage gewesen, um es zu erhalten, indem npm install cors tat und dann mit var cors = require('cors'); und app.use(cors()); in meiner Express.js Quelle, aber wie ich es verstehe, die die API bis zu Anfragen von überall geöffnet. Was, wenn ich wirklich möchte, dass es nur auf meiner eigenen Domain zugänglich ist? Ich meine, angenommen, es wäre eine Produktionsstätte mysite.com und das Formular ist um mysite.com/form und das Back-End ist um . Ich denke, ich bekomme diese Beispielideen richtig, aber da ich neu bin, bin ich mir nicht sicher.

Wie kann ich erreichen, dass sie auf derselben Domain ausgeführt werden, um keine herkunftsübergreifende Anfrage zu stellen? Gibt es einen Standard Weg dies zu tun? Von jetzt an möchte ich das Backend bekommen und das Formular, das auf demselben Port ausgeführt wird, müsste die Formularseite aus dem Express.js-Backend selbst bedienen, aber was, wenn ich nicht möchte, dass Express mein Server ist? Was wäre, wenn ich Seiten auf andere Weise bereitstellen möchte, z. B. von Apache oder etwas, und nur dieses Formular dort haben möchte, das seine Daten zur Verarbeitung an Express sendet? Oder wenn ich eine Angular-App ausführen möchte, die die POST-Daten an das Express-Backend sendet, um sie erneut zu verarbeiten?

Vielen Dank!

Antwort

2

Wenn Sie mit CORS bleiben möchten, können Sie es so konfigurieren, dass eine bestimmte Herkunft bleiben: https://www.npmjs.com/package/cors#configuring-cors Aber bedenken Sie, dass dies nicht daran hindert, von jemand anderem Ihre API über einen einfachen curl Befehl zugreifen. CORS ist da, um den Browser zu schützen, nicht die API.

Ein besserer Ansatz (den Sie selbst erwähnten) wäre, dass beide Teile in derselben Domäne und demselben Port laufen. Dies kann durch die Weiterleitung der Anfragen erreicht werden. In Express können Sie einfach Ihren Frontend-Code als statische Assets mit express.static() liefern. In Apache könnten Sie auch einige Proxies hinzufügen, obwohl ich Ihnen dort nicht helfen kann, da ich Apache-Module und Setups nicht so gut kenne.

Die Sicherung Ihrer API vor dem Zugriff von Drittanbietern ist ein anderes Thema. Sie benötigen eine Form der Authentifizierung und Autorisierung. Dieses Recht zu tun kann schwer sein. Vielleicht sollten Sie sich Oauth 2 für einen bewährten Standard ansehen.

+0

Dies: Ein besserer Ansatz (den Sie selbst erwähnten) wäre, dass beide Teile in der gleichen Domäne und demselben Port laufen. – maaw

+0

"CORS ist da, um den Browser zu schützen, nicht die API" - wenn das so ist, wie kommt es dann, dass das Aktivieren von CORS auf der Express-Seite der Dinge ermöglicht, dass die POST-Anfrage funktioniert? Es scheint, als ob die Express-API die Verbindung und nicht den Browser ablehnt. – steelstring94

+0

Normalerweise hält ein Browser dieselbe Herkunftsrichtlinie ein. Hier können Sie mehr lesen: https://en.wikipedia.org/wiki/Same-origin_policy Durch die Verwendung von CORS ist diese Richtlinie für bestimmte Domains deaktiviert, was einen Cross-Origin-Zugriff erlaubt. Es ist immer noch die Browser-Entscheidung, ob die Anfrage wirklich ausgeführt wird oder nicht. Der Server sagt nur, ob er "die Anfrage erfüllen soll" (https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS). Also fragt Ihr Browser "ist meine Domain für den Zugriff speichern", und Wenn ja, interpretiert es das Ergebnis. Andernfalls stoppt es, indem eine Ausnahme ausgelöst wird. Hoffe das hilft ;-) – alex3683

Verwandte Themen