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)
在启动期间会立即进行评估。
【讨论】:
Hoexpress
明白它必须返回 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 获取私有视频(域白名单)[关闭]