Express CORS域白名单

Posted

技术标签:

【中文标题】Express CORS域白名单【英文标题】:Express CORS domain whitelist 【发布时间】:2016-07-23 10:33:33 【问题描述】:

我正在使用这个模块来处理 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

【问题讨论】:

为什么 cors 模块自述文件中的原始示例不适合您?您的代码实际上在做同样的事情,只是将其推迟到收到请求为止。 @mscdex 我做了更多的调试,实际上原始的东西正在工作。但是我有点困惑为什么行res.json( msg: 'This is CORS-enabled for a whitelisted domain.' );被执行但我得到的响应实际上是No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 【参考方案1】:

原因是在调用cors(corsOptions)corsOptions 仍然是undefined(实际上与cors() 相同),因为cors(corsOptions) 在启动期间会立即进行评估。

【讨论】:

Ho express 明白它必须返回 No 'Access-Control-Allow-Origin' 错误而不是 res.json( msg: 'This is CORS-enabled for a whitelisted domain.' ); 吗?我可以看到res.json( msg: 'This is CORS-enabled for a whitelisted domain.' ); 行从non whitelisted 域发送请求时被执行是因为cors(corsOptions) 参与其中? cors(corsOptions) 返回一个中间件函数。每个对/products/:id 的 POST 请求都会调用该函数,但在调用实际路由处理程序之前。这允许cors 中间件在请求到达路由处理程序之前拒绝它。您可以将尽可能多的中间件传递给app.post() 或任何其他接受中间件/路由处理程序的函数,它将按顺序处理它们。 我仍然很困惑,但是响应是正确的,但是路由代码总是被执行,这不太正确,因为在non whitelisted域的情况下我不需要执行路由代码。只需在此处提出单独的问题***.com/questions/36393965/…。 那么您是说文档中的示例应该有效还是无效?除非我实施与 OP 相同的修复,否则它对我不起作用。

以上是关于Express CORS域白名单的主要内容,如果未能解决你的问题,请参考以下文章

Vimeo PHP-SDK 获取私有视频(域白名单)[关闭]

在 Django 中根据端点设置不同的 CORS 规则

Firebase CORS,将 IP 范围列入白名单

Cordova 应用程序的 API 服务器 CORS 白名单

使用 Apache 将 CORS 列入白名单

如何使用 Flask CORS 将域列入白名单