NodeJS Express CORS域名白名单

eoxn13cs  于 2023-10-17  发布在  Node.js
关注(0)|答案(2)|浏览(149)

我用这个模块来处理cors请求https://www.npmjs.com/package/cors我需要限制所有域,除了白名单
来自官方CORS模块示例:

var whitelist = ['http://example1.com', 'http://example2.com'];
var corsOptions = {
  origin: function(origin, callback){
    var originIsWhitelisted = whitelist.indexOf(origin) !== -1;
    callback(null, originIsWhitelisted);
  }
};

app.get('/products/:id', cors(corsOptions), function(req, res, next){
  res.json({msg: 'This is CORS-enabled for a whitelisted domain.'});
});

我把它改成了这个:

var origin;
var corsOptions;
app.all('*', function (req, res, next) {
    origin = req.get('origin');
    var whitelist = ['http://example1.com', 'http://example2.com'];
    corsOptions = {
        origin: function (origin, callback) {
            var originIsWhitelisted = whitelist.indexOf(origin) !== -1;
            callback(null, originIsWhitelisted);
        }
    };
    next();
});
app.post('/products/:id', cors(corsOptions), function (req, res, next) {
    res.json({ msg: 'This is CORS-enabled for a whitelisted domain.' });
});

然后我通过发布到app.post('/products/:id'...)来运行http://localhost:8080的测试,我希望它不会被执行,因为http://localhost:8080没有被列入白名单,但实际上它确实被列入了白名单。你知道为什么以及如何解决这个问题吗?
另外,我没有添加cors(corsOptions)观看,但它说-not available

x6yk4ghg

x6yk4ghg1#

原因是当cors(corsOptions)被调用时,corsOptions仍然是undefined(实际上与cors()相同),因为cors(corsOptions)在启动时立即被计算。

3qpi33ja

3qpi33ja2#

下面是我在nodejs expressjs中的解决方案。
1.在.env文件中添加允许的来源。这样就没人知道你把哪些域名列入了白名单
ALLOWED_ORIGINS=https://foo.example1 https://foo.example2
1.为customCorsOptions创建中间件。

const customCorsOptions = {
  origin: (origin, callback) => {
    const allowedOrigins = process.env.ALLOWED_ORIGINS.split(" ");
    if (allowedOrigins.indexOf(origin) !== -1) {
      callback(null, true);
    } else {
      callback(new Error("Request from unauthorized origin"));
    }
  },
};

export default customCorsOptions;

1.使用cors

import express from "express";
import dotenv from "dotenv";
import cors from "cors";

import customCorsOptions from "./middleware/customCorsOptions.js";

/* CONFIGURATION */
dotenv.config(); // This needs to be configured first to use env variables everywhere
const app = express();
app.use(cors(customCorsOptions));

// other codes in your server.js

相关问题