Node.js实现CORS多域名白名单设置

2 下载量 94 浏览量 更新于2024-09-02 收藏 69KB PDF 举报
"Node.js设置CORS跨域请求中多域名白名单的方法" 在Node.js开发中,处理CORS(Cross-Origin Resource Sharing,跨源资源共享)是一项常见的任务,特别是在构建API服务时。CORS允许不同源的浏览器客户端向服务器发起请求,以突破同源策略的限制。通常,为了安全性,我们需要限制哪些域名可以访问我们的API。本文将详细介绍如何在Node.js中设置多域名白名单以实现安全的CORS策略。 首先,CORS是通过设置响应头`Access-Control-Allow-Origin`来控制的。默认情况下,这个头的值应为请求发起的源(即浏览器中的URL)。设置为`*`表示允许所有源访问,但这并不是最佳实践,因为它可能导致安全问题。理想情况下,我们应该明确指定允许访问的域名。 在Node.js中,直接使用逗号分隔的多个域名或者正则表达式来设置`Access-Control-Allow-Origin`是无效的。Node.js的响应头`res.header()`方法不支持正则匹配,且值只能是单个字符串或`*`。因此,我们需要采取其他策略来实现多域名白名单。 一种可行的方法是使用自定义中间件来处理这个问题。中间件可以检查请求的源,并根据预定义的白名单决定是否允许访问。以下是一个简单的示例: ```javascript const allowedDomains = ['a.666.com', 'b.666.com', 'c.666.com']; function corsMiddleware(req, res, next) { const origin = req.headers['origin']; if (allowedDomains.includes(origin)) { res.setHeader('Access-Control-Allow-Origin', origin); res.setHeader('Access-Control-Allow-Credentials', 'true'); // 允许发送Cookie res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); // 设置允许的方法 res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization'); // 设置允许的自定义头部 if (req.method === 'OPTIONS') { res.status(204).end(); // 对预检请求返回204 } else { next(); } } else { res.status(403).send('Forbidden'); // 非白名单域名,返回403错误 } } app.use(corsMiddleware); ``` 在这个例子中,我们创建了一个名为`corsMiddleware`的函数,它会检查`origin`请求头的值是否在`allowedDomains`数组内。如果在白名单内,我们就设置相应的CORS响应头;否则,返回403 Forbidden错误。 此外,还可以考虑使用第三方库如`cors`来简化这一过程。`cors`库提供了一个便捷的方式来配置CORS策略,包括多域名白名单: ```javascript const cors = require('cors'); const whitelist = ['a.666.com', 'b.666.com', 'c.666.com']; const options = { origin: function(origin, callback) { if (whitelist.indexOf(origin) !== -1) { callback(null, true); } else { callback(new Error('Not allowed by CORS')); } }, }; app.use(cors(options)); ``` 在这个例子中,我们通过`origin`选项传递一个回调函数,该函数会检查请求的源是否在白名单中。如果在,回调函数返回`true`,否则返回错误。 总结来说,实现Node.js中的多域名白名单CORS策略,可以通过自定义中间件或利用第三方库如`cors`来完成。关键在于正确设置`Access-Control-Allow-Origin`响应头,并确保只有指定的域名能够访问你的API。这不仅提高了安全性,也符合RESTful API设计的最佳实践。