Uma implementação de CORS para Node.js altamente configurável e compatível com middleware.
Access-Control-Request-Headers
vazio.OPTIONS
, verifique a opção endPreflightRequests
.(err, matches)
em vez de apenas (matches)
. Veja example/express/
para um exemplo prático.
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);
Veja example/connect/
para um exemplo prático.
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
simples 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);
Criar um ouvinte de solicitação Corser que gere os cabeçalhos de resposta apropriados para habilitar o CORS é tão simples quanto:
corser.create()
Isso equivale a definir um cabeçalho de resposta de Access-Control-Allow-Origin: *
. Se você quiser restringir as origens ou permitir cabeçalhos de solicitação ou resposta mais sofisticados, será necessário passar um objeto de configuração para corser.create
.
A Corser encerrará automaticamente as solicitações de comprovação para você. Uma solicitação de comprovação é uma solicitação OPTIONS
especial que o navegador envia sob certas condições para negociar com o servidor quais métodos, cabeçalhos de solicitação e cabeçalhos de resposta são permitidos para uma solicitação CORS. Se você precisar usar o método OPTIONS
para outras coisas, basta definir endPreflightRequests
como false
e encerrar essas solicitações você mesmo:
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.
}
});
Um objeto de configuração com as propriedades a seguir pode ser passado para corser.create
.
origins
Uma lista branca de origens que diferencia maiúsculas de minúsculas. Caso a solicitação venha de uma origem que não esteja nesta lista, ela não será tratada pelo CORS. Para aceitar todas as origens (o comportamento Access-Control-Allow-Origin: *
), omita a propriedade ou defina-a como uma matriz vazia ( []
).
Para permitir a verificação dinâmica de origem, uma função (origin, callback)
pode ser passada em vez de um array. origin
é o cabeçalho Origin, callback
é uma função (err, matches)
, onde matches
é um sinalizador booleano que indica se o cabeçalho Origin fornecido corresponde ou não.
Padrão: todas as origens são aceitas.
methods
Uma lista branca de métodos em letras maiúsculas. Se a solicitação utilizar um método que não esteja nesta lista, ela não será tratada pelo CORS.
Definir um valor aqui substituirá a lista de métodos simples padrão. Para não perdê-los, concatene os métodos que deseja adicionar com corser.simpleMethods
: corser.simpleMethods.concat(["PUT", "DELETE"])
.
Padrão: métodos simples ( GET
, HEAD
, POST
).
requestHeaders
Uma lista branca de cabeçalhos de solicitação que não diferencia maiúsculas de minúsculas. Se a solicitação usar um cabeçalho de solicitação que não esteja nesta lista, ela não será tratada pelo CORS.
Definir um valor aqui substituirá a lista de cabeçalhos de solicitação simples padrão. Para não perdê-los, concatene os cabeçalhos de solicitação que deseja adicionar com corser.simpleRequestHeaders
: corser.simpleRequestHeaders.concat(["Authorization"])
.
Padrão: cabeçalhos de solicitação simples ( Accept
, Accept-Language
, Content-Language
, Content-Type
, Last-Event-ID
).
responseHeaders
Uma lista branca de cabeçalhos de resposta que não diferencia maiúsculas de minúsculas. Qualquer cabeçalho de resposta que não esteja nesta lista será filtrado pelo agente do usuário (o navegador).
Definir um valor aqui substituirá a lista de cabeçalhos de resposta simples padrão. Para não perdê-los, concatene os cabeçalhos de resposta que deseja adicionar com corser.simpleResponseHeaders
: corser.simpleResponseHeaders.concat(["ETag"])
.
Padrão: cabeçalhos de resposta simples ( Cache-Control
, Content-Language
, Content-Type
, Expires
, Last-Modified
, Pragma
).
supportsCredentials
Um booleano que indica se as credenciais do cookie podem ser transferidas como parte de uma solicitação CORS. Atualmente, apenas alguns elementos HTML5 podem se beneficiar dessa configuração.
Padrão: false
.
maxAge
Um número inteiro que indica o tempo máximo em segundos que uma solicitação de simulação é mantida no cache de resultados de simulação do lado do cliente.
Padrão: não definido.
endPreflightRequests
Um booleano que indica se as solicitações de simulação do CORS devem ser fechadas automaticamente.
Padrão: true
.
Origin X is not allowed by Access-Control-Allow-Origin
Verifique se o cabeçalho Origin
da sua solicitação corresponde a uma das origens fornecidas na propriedade origins
do objeto de configuração. Se você não definiu nenhuma propriedade origins
, vá para a próxima pergunta.
Se isso não ajudar, sua solicitação poderá usar um método não simples ou um ou mais cabeçalhos não simples (veja a próxima pergunta). De acordo com a especificação, o conjunto de métodos simples é GET
, HEAD
e POST
, e o conjunto de cabeçalhos de solicitação simples é Accept
, Accept-Language
, Content-Language
, Content-Type
e Last-Event-ID
. Se sua solicitação usar qualquer outro método ou cabeçalho, você deverá listá-los explicitamente nos methods
ou na propriedade requestHeaders
do objeto de configuração.
Você deseja permitir solicitações que usam um cabeçalho X-Requested-With
. Passe o seguinte objeto de configuração para corser.create
:
corser.create({
requestHeaders: corser.simpleRequestHeaders.concat(["X-Requested-With"])
});
Request header field Content-Type is not allowed by Access-Control-Allow-Headers
Uma configuração padrão só funcionará se o cliente enviar uma solicitação "simples", ou seja, GET
, HEAD
, POST
como método e alguns cabeçalhos como Accept
, Accept-Language
, Content-Language
e Content-Type
, Content-Type
tem uma restrição importante: somente application/x-www-form-urlencoded
, multipart/form-data
e text/plain
são permitidos.
Normalmente, o Content-Type
de uma API será application/json
e isso não é permitido por padrão. Content-Type
precisa ser especificado explicitamente no objeto de configuração na chave requestHeaders
:
corser.create({
requestHeaders: corser.simpleRequestHeaders.concat(["Content-Type"])
});
Refused to get unsafe header "X"
Seu navegador bloqueia todos os cabeçalhos de resposta não simples que não foram explicitamente permitidos na solicitação de simulação. O conjunto de cabeçalhos de resposta simples é Cache-Control
, Content-Language
, Content-Type
, Expires
, Last-Modified
, Pragma
. Se quiser acessar qualquer outro cabeçalho de resposta, você deverá listá-los explicitamente na propriedade responseHeaders
do objeto de configuração.
Você deseja permitir que os clientes leiam o cabeçalho ETag
de uma resposta. Passe o seguinte objeto de configuração para corser.create
:
corser.create({
responseHeaders: corser.simpleResponseHeaders.concat(["ETag"])
});