Разрешить несколько доменов CORS в express js

как разрешить несколько доменов для CORS в express упрощенным способом.

Я

 cors: {
        origin: "www.one.com";
    }

    app.all('*', function(req, res, next) {
            res.header("Access-Control-Allow-Origin", cors.origin);
            res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
            next();
        });

это работает, когда есть только один домен, упомянутый в origin

но если я хочу иметь origin как массив доменов, и я хочу разрешить CORS для всех доменов в массиве origin, у меня было бы что - то вроде этого -

cors: {
            origin: ["www.one.com","www.two.com","www.three.com"];
        }

но тогда проблема в том, что этот код ниже не будет работать -

app.all('*', function(req, res, next) {
                res.header("Access-Control-Allow-Origin", cors.origin);
                res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
                next();
            });

как сделать res.header возьмите массив доменов через cors.origin ?

3 ответов


Я бы рекомендовал cors-модуль:https://www.npmjs.org/package/cors Он делает такие вещи для вас-проверьте "настройка CORS w / Dynamic Origin"-раздел


позволяет понять, как работает этот заголовок. "Access-Control-Allow-Origin" принимает только строку. Поэтому, чтобы сделать его динамическим, вам нужно получить запрашивающий хост из заголовка http. Проверьте его на соответствие вашему массиву авторизованных доменов. Если он присутствует, добавьте его в качестве значения в заголовок, иначе добавление значения по умолчанию запретит несанкционированным доменам доступ к API.

для этого нет собственной реализации. Вы можете сделать это самостоятельно, используя приведенный ниже код.

cors: {
            origin: ["www.one.com","www.two.com","www.three.com"],
            default: "www.one.com"
        }

app.all('*', function(req, res, next) {
                var origin = cors.origin.indexOf(req.header('host').toLowerCase()) > -1 ? req.headers.origin : cors.default;
                res.header("Access-Control-Allow-Origin", origin);
                res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
                next();
            });

фактически, заголовок Access-Control-Allow-Origin должен иметь то же значение, что и заголовок Origin, если вы хотите разрешить его.

поэтому база на вашем коде просто

cors: {
    origin: ["www.one.com","www.two.com","www.three.com"]
}



app.all('*', function(req, res, next) {
            let origin = req.headers.origin;
            if(cors.origin.indexOf(origin) >= 0){
                res.header("Access-Control-Allow-Origin", origin);
            }         
            res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
            next();
        });