cors middleware
CORS ist eine Node.js Middleware für Express/Connect, die CORS Antwort-Kopfzeilen setzt. Diese Header geben Browsern an, welche Herkunft Antworten von Ihrem Server lesen kann.
Note
Wie CORS funktioniert: Dieses Paket setzt Antwort-Header – es blockiert keine Anfragen. CORS wird von Browsern durchgesetzt: Sie überprüfen die Kopfzeilen und entscheiden, ob JavaScript die Antwort lesen kann. Clients ohne Browser (curl, Postman, andere Servern) ignorieren CORS vollständig. Siehe MDN CORS Anleitung für Details.
Installation
Dies ist ein Node.js Modul über die
npm Registry. Installation erfolgt mit dem
npm install Befehl:
$ npm install corsAuslastung
Einfache Nutzung (Aktiviere All CORS-Anfragen)
var express = require('express');var cors = require('cors');var app = express();
// Adds headers: Access-Control-Allow-Origin: *app.use(cors());
app.get('/products/:id', function (req, res, next) { res.json({ msg: 'Hello' });});
app.listen(80, function () { console.log('web server listening on port 80');});Aktiviere CORS für eine einzelne Route
var express = require('express');var cors = require('cors');var app = express();
// Adds headers: Access-Control-Allow-Origin: *app.get('/products/:id', cors(), function (req, res, next) { res.json({ msg: 'Hello' });});
app.listen(80, function () { console.log('web server listening on port 80');});Configuring CORS
Siehe Konfigurationsoptionen für Details.
var express = require('express');var cors = require('cors');var app = express();
var corsOptions = { origin: 'http://example.com', optionsSuccessStatus: 200, // some legacy browsers (IE11, various SmartTVs) choke on 204};
// Adds headers: Access-Control-Allow-Origin: http://example.com, Vary: Originapp.get('/products/:id', cors(corsOptions), function (req, res, next) { res.json({ msg: 'Hello' });});
app.listen(80, function () { console.log('web server listening on port 80');});CORS mit dynamischem Ursprung konfigurieren
Dieses Modul unterstützt die dynamische Validierung des Ursprungs mittels einer Funktion mit der Option origin
. Diese Funktion wird eine Zeichenkette übergeben, die der Ursprung
ist (oder undefined wenn die Anfrage keine Herkunft hat), und ein callback mit der Signatur
callback(error, origin).
Das origin Argument zum Callback kann jeder Wert für die origin
Option der Middleware außer einer Funktion sein. Siehe
Konfigurationsoptionen für weitere Informationen zu allen
möglichen Werttypen.
Diese Funktion ist so konzipiert, dass das dynamische Laden von erlaubten Ursprung(en) von eine Backup-Datenquelle, wie eine Datenbank, ermöglicht wird.
var express = require('express');var cors = require('cors');var app = express();
var corsOptions = { origin: function (origin, callback) { // db.loadOrigins is an example call to load // a list of origins from a backing database db.loadOrigins(function (error, origins) { callback(error, origins); }); },};
// Adds headers: Access-Control-Allow-Origin: <matched origin>, Vary: Originapp.get('/products/:id', cors(corsOptions), function (req, res, next) { res.json({ msg: 'Hello' });});
app.listen(80, function () { console.log('web server listening on port 80');});Aktiviere CORS Pre-Flight
Bestimmte CORS-Anfragen werden als ‘komplex’ angesehen und benötigen eine erste
OPTIONS Anfrage (genannt die “Pre-Flug-Anfrage”). Ein Beispiel für eine
‘komplexe’ CORS-Anfrage ist eine, die ein anderes HTTP-Verb als
GET/HEAD/POST (wie z. B. DELETE) verwendet oder benutzerdefinierte Header verwendet. Um
vor dem Flug zu aktivieren, müssen Sie einen neuen OPTIONS-Handler für die Route hinzufügen, die Sie
unterstützen möchten:
var express = require('express');var cors = require('cors');var app = express();
app.options('/products/:id', cors()); // preflight for DELETEapp.delete('/products/:id', cors(), function (req, res, next) { res.json({ msg: 'Hello' });});
app.listen(80, function () { console.log('web server listening on port 80');});Sie können auch vorläufige Flüge wie folgt aktivieren:
app.options('*', cors()); // include before other routesHINWEIS: Wenn diese Middleware als Middleware für Anwendungen verwendet wird (z.B.
beispielsweise, app.use(cors())), werden Preflight-Anfragen bereits für alle
Routen abgewickelt.
Anpassung der CORS-Einstellungen dynamisch pro Anfrage
Für APIs, die unterschiedliche CORS-Konfigurationen für bestimmte Routen oder Anfragen benötigen, können Sie auf der Basis der eingehenden Anfrage dynamisch CORS-Optionen generieren. Die cors Middleware erlaubt dir, dies zu erreichen, indem du eine Funktion anstelle von statischen Optionen übergibt. Diese Funktion wird für jede eingehende Anfrage aufgerufen und muss das Callback-Muster verwenden, um die entsprechenden CORS-Optionen zurückzugeben.
Die Funktion akzeptiert:
-
req:- Das eingehende Anfrageobjekt.
-
callback(error, corsOptions):- Eine Funktion, die zur Rückgabe der berechneten CORS-Optionen verwendet wird.
- Argumente:
error:nullübergeben, wenn kein Fehler vorliegt, oder ein Fehlerobjekt, um einen Fehler anzuzeigen.corsOptions: Ein Objekt, das die CORS-Richtlinie für die aktuelle Anfrage angibt.
Hier ein Beispiel, das sowohl öffentliche Routen als auch eingeschränkte, vertrauenswürdige Routen behandelt:
var dynamicCorsOptions = function (req, callback) { var corsOptions; if (req.path.startsWith('/auth/connect/')) { // Access-Control-Allow-Origin: http://mydomain.com, Access-Control-Allow-Credentials: true, Vary: Origin corsOptions = { origin: 'http://mydomain.com', credentials: true, }; } else { // Access-Control-Allow-Origin: * corsOptions = { origin: '*' }; } callback(null, corsOptions);};
app.use(cors(dynamicCorsOptions));
app.get('/auth/connect/twitter', function (req, res) { res.send('Hello');});
app.get('/public', function (req, res) { res.send('Hello');});
app.listen(80, function () { console.log('web server listening on port 80');});Konfigurationsoptionen
origin: Konfiguriert den Access-Control-Allow-Origin CORS-Header. Mögliche Werte:Boolean- setzeoriginauftrueum die request origin, wie sie vonreq.header('Origin')definiert wurde, zu reflektieren, oder setze sie auffalseum CORS zu deaktivieren.String- Setzeoriginauf einen bestimmten Ursprung. Zum Beispiel, wenn Sie es setzen auf"http://example.com"nur Anfragen von “http://example.com” werden erlaubt."*"für alle Domains erlaubt.
RegExp- Setzeoriginauf ein reguläres Ausdruckmuster welches verwendet wird, um den Abfrage-Ursprung zu testen. Wenn es sich um eine Übereinstimmung handelt, wird der Ursprung der Anfrage reflektiert. Zum Beispiel spiegelt das Muster/example\.com$/jede Anfrage wider, die von einem Ursprungsland stammt, der mit “example.com” endet.Array- setzeoriginauf ein Array gültiger Quellen. Jeder Ursprung kann einStringoder eineRegExpsein. Zum Beispiel akzeptiert["http://example1.com", /\.example2\.com$/]jede Anfrage von “http://example1.com” oder von einer Subdomain von “example2.com”.Function- Setzeoriginauf eine Funktion, die eine benutzerdefinierte Logik implementiert. Die Funktion nimmt den Abfrage-Ursprung als ersten Parameter und einen Rückruf (alscallback(err, origin), wobeioriginein nicht-Funktionswert deroriginOption ist) als zweites ist.
methods: Konfiguriert den Access-Control-Allow-Methoden CORS-Header. Erwartet einen Komma-getrennten String (z. B.: ‘GET,PUT,POST’) oder ein Array (z. B.:['GET', 'PUT', 'POST']).allowedHeaders: Konfiguriert den Access-Control-Allow-Headers CORS-Header. Erwartet einen Komma-getrennten String (z.B. ‘Content-Type,Authorization’) oder ein Array (z.B.['Content-Type', 'Authorization']). Falls nicht angegeben, wird standardmäßig die im Header Access-Control-Request-Header der Anfrage angegebenen Kopfzeilen reflektiert.exposedHeaders: Konfiguriert den Access-Control-Expose-Headers CORS-Header. Erwartet einen kommaseparierten String (z.B. ‘Content-Range,X-Content-Range’) oder ein Array (z.B.['Content-Range', 'X-Content-Range']). Wenn nicht angegeben, werden keine benutzerdefinierten Header angezeigt.credentials: Konfiguriert den access-Control-Allow-Credentials CORS-Header. Setzetrueum den Header zu übergeben, sonst wird er weggelassen.maxAge: Konfiguriert den Access-Control-Max-Age CORS-Header. Setze auf eine Ganzzahl, um den Header zu übergeben, andernfalls wird er weggelassen.preflightContinue: Übergeben Sie die CORS-Vorflug-Antwort an den nächsten Handler.optionsSuccessStatus: Stellt einen Statuscode zur Verfügung, der für erfolgreicheOPTIONS-Anfragen verwendet werden kann, da einige alte Browser (IE11, verschiedene SmartTVs) auf204erstickt wurden.
Die Standardkonfiguration ist das Äquivalent von:
{ "origin": "*", "methods": "GET,HEAD,PUT,PATCH,POST,DELETE", "preflightContinue": false, "optionsSuccessStatus": 204}Häufige Fehlkonzepte
”CORS blockiert Anfragen von nicht erlaubten Ursprungen”
Nein. Ihr Server empfängt und verarbeitet jede Anfrage. CORS-Header geben dem Browser an, ob JavaScript die Antwort lesen kann – nicht, ob die Anfrage erlaubt ist.
”CORS schützt meine API vor unbefugtem Zugriff”
Nein. CORS ist keine Zugriffskontrolle. Jeder HTTP-Client (curl, Postman, ein anderer Server) kann Ihre API unabhängig von den CORS-Einstellungen aufrufen. Verwenden Sie Authentifizierung und Autorisierung, um Ihre API zu schützen.
”Setze origin: 'http://example.com' bedeutet nur, dass die Domain auf meinen Server zugreifen kann”
Nein. Das bedeutet, dass Browser JavaScript nur von dieser Quelle lesen können. Der Server antwortet immer noch auf alle Anfragen.