Une implémentation hautement configurable et compatible avec le middleware de CORS pour Node.js.
Access-Control-Request-Headers
vide.OPTIONS
, cochez l'option endPreflightRequests
.(err, matches)
au lieu de simplement (matches)
. Voir example/express/
pour un exemple fonctionnel.
var express, corser, app;
express = require("express");
corser = require("corser");
app = express();
app.use(corser.create());
app.get("/", function (req, res) {
res.writeHead(200);
res.end("Nice weather today, huh?");
});
app.listen(1337);
Voir example/connect/
pour un exemple fonctionnel.
var connect, corser, app;
connect = require("connect");
corser = require("corser");
app = connect();
app.use(corser.create());
app.use(function (req, res) {
res.writeHead(200);
res.end("Nice weather today, huh?");
});
app.listen(1337);
http
simple var http, corser, corserRequestListener;
http = require("http");
corser = require("corser");
// Create Corser request listener.
corserRequestListener = corser.create();
http.createServer(function (req, res) {
// Route req and res through the request listener.
corserRequestListener(req, res, function () {
res.writeHead(200);
res.end("Nice weather today, huh?");
});
}).listen(1337);
Créer un écouteur de requête Corser qui génère les en-têtes de réponse appropriés pour activer CORS est aussi simple que :
corser.create()
Cela équivaut à définir un en-tête de réponse Access-Control-Allow-Origin: *
. Si vous souhaitez restreindre les origines ou autoriser des en-têtes de requête ou de réponse plus sophistiqués, vous devez transmettre un objet de configuration à corser.create
.
Corser mettra automatiquement fin aux demandes de contrôle en amont pour vous. Une requête de contrôle en amont est une requête OPTIONS
spéciale que le navigateur envoie sous certaines conditions pour négocier avec le serveur quelles méthodes, en-têtes de requête et en-têtes de réponse sont autorisés pour une requête CORS. Si vous devez utiliser la méthode OPTIONS
pour d'autres choses, définissez simplement endPreflightRequests
sur false
et terminez ces requêtes vous-même :
var corserRequestListener;
corserRequestListener = corser.create({
endPreflightRequests: false
});
corserRequestListener(req, res, function () {
if (req.method === "OPTIONS") {
// End CORS preflight request.
res.writeHead(204);
res.end();
} else {
// Implement other HTTP methods.
}
});
Un objet de configuration avec les propriétés suivantes peut être transmis à corser.create
.
origins
Une liste blanche d'origines sensible à la casse. Si la demande provient d'une origine qui ne figure pas dans cette liste, elle ne sera pas traitée par CORS. Pour accepter toutes les origines (le comportement Access-Control-Allow-Origin: *
), omettez la propriété ou définissez-la sur un tableau vide ( []
).
Pour permettre une vérification dynamique de l'origine, une fonction (origin, callback)
peut être transmise à la place d'un tableau. origin
est l'en-tête Origin, callback
est une fonction (err, matches)
, où matches
est un indicateur booléen qui indique si l'en-tête Origin donné correspond ou non.
Par défaut : toutes les origines sont acceptées.
methods
Une liste blanche de méthodes en majuscules. Si la requête utilise une méthode qui ne figure pas dans cette liste, elle ne sera pas traitée par CORS.
Définir une valeur ici écrasera la liste des méthodes simples par défaut. Pour ne pas les perdre, concaténez les méthodes que vous souhaitez ajouter avec corser.simpleMethods
: corser.simpleMethods.concat(["PUT", "DELETE"])
.
Par défaut : méthodes simples ( GET
, HEAD
, POST
).
requestHeaders
Une liste blanche d'en-têtes de requête insensible à la casse. Si la requête utilise un en-tête de requête qui ne figure pas dans cette liste, elle ne sera pas traitée par CORS.
Définir une valeur ici écrasera la liste des en-têtes de requêtes simples par défaut. Pour ne pas les perdre, concaténez les en-têtes de requête que vous souhaitez ajouter avec corser.simpleRequestHeaders
: corser.simpleRequestHeaders.concat(["Authorization"])
.
Par défaut : en-têtes de requête simples ( Accept
, Accept-Language
, Content-Language
, Content-Type
, Last-Event-ID
).
responseHeaders
Une liste blanche d'en-têtes de réponse qui ne respecte pas la casse. Tout en-tête de réponse qui ne figure pas dans cette liste sera filtré par l'agent utilisateur (le navigateur).
Définir une valeur ici écrasera la liste des en-têtes de réponse simples par défaut. Pour ne pas les perdre, concaténez les en-têtes de réponse que vous souhaitez ajouter avec corser.simpleResponseHeaders
: corser.simpleResponseHeaders.concat(["ETag"])
.
Par défaut : en-têtes de réponse simples ( Cache-Control
, Content-Language
, Content-Type
, Expires
, Last-Modified
, Pragma
).
supportsCredentials
Un booléen qui indique si les informations d'identification du cookie peuvent être transférées dans le cadre d'une requête CORS. Actuellement, seuls quelques éléments HTML5 peuvent bénéficier de ce paramètre.
Par défaut : false
.
maxAge
Nombre entier qui indique la durée maximale en secondes pendant laquelle une demande de contrôle en amont est conservée dans le cache des résultats du contrôle en amont côté client.
Par défaut : non défini.
endPreflightRequests
Un booléen qui indique si les demandes de contrôle en amont CORS doivent être automatiquement fermées.
Par défaut : true
.
Origin X is not allowed by Access-Control-Allow-Origin
Vérifiez si l'en-tête Origin
de votre requête correspond à l'une des origines fournies dans la propriété origins
de l'objet de configuration. Si vous n'avez défini aucune propriété origins
, passez à la question suivante.
Si cela ne résout pas le problème, votre demande peut utiliser une méthode non simple ou un ou plusieurs en-têtes non simples (voir question suivante). Selon la spécification, l'ensemble des méthodes simples est GET
, HEAD
et POST
, et l'ensemble des en-têtes de requête simples est Accept
, Accept-Language
, Content-Language
, Content-Type
et Last-Event-ID
. Si votre requête utilise une autre méthode ou un autre en-tête, vous devez les répertorier explicitement dans la propriété methods
ou requestHeaders
de l'objet de configuration.
Vous souhaitez autoriser les requêtes qui utilisent un en-tête X-Requested-With
. Transmettez l'objet de configuration suivant à corser.create
:
corser.create({
requestHeaders: corser.simpleRequestHeaders.concat(["X-Requested-With"])
});
Request header field Content-Type is not allowed by Access-Control-Allow-Headers
Une configuration par défaut ne fonctionnera que si le client envoie une requête "simple", c'est-à-dire GET
, HEAD
, POST
comme méthode, et certains en-têtes tels que Accept
, Accept-Language
, Content-Language
et Content-Type
, Content-Type
a une restriction importante : seuls application/x-www-form-urlencoded
, multipart/form-data
et text/plain
sont autorisés.
Généralement, le Content-Type
d'une API sera application/json
, ce qui n'est pas autorisé par défaut. Content-Type
doit être explicitement spécifié dans l'objet de configuration sous la clé requestHeaders
:
corser.create({
requestHeaders: corser.simpleRequestHeaders.concat(["Content-Type"])
});
Refused to get unsafe header "X"
Votre navigateur bloque tous les en-têtes de réponse non simples qui n'ont pas été explicitement autorisés dans la demande de contrôle en amont. L'ensemble des en-têtes de réponse simples est Cache-Control
, Content-Language
, Content-Type
, Expires
, Last-Modified
, Pragma
. Si vous souhaitez accéder à un autre en-tête de réponse, vous devez les répertorier explicitement dans la propriété responseHeaders
de l'objet de configuration.
Vous souhaitez autoriser les clients à lire l'en-tête ETag
d'une réponse. Transmettez l'objet de configuration suivant à corser.create
:
corser.create({
responseHeaders: corser.simpleResponseHeaders.concat(["ETag"])
});