我有一个从API中提取数据的Node / React应用程序。
在服务器端(server.js
),我有一个“内部”URL,用于从API中获取数据,然后将其作为JSON返回。像这样:
server.get('/api/data', (req, res) => {
Promise.resolve(getAPIData()).then(data => {
res.writeHead(200, {'Content-Type': 'application/json'})
return res.end(serialize(data))
}).catch((error) => {
console.log(error)
res.writeHead(200, {'Content-Type': 'application/json'})
return res.end(serialize({}))
})
})
然后在React(Next.js)的前端,我使用example.com/api/data
URL获取此JSON并将其显示在页面上。
我的问题是我想限制只能从我的域访问example.com/api/data
网址(在这种情况下,我们说的是example.com)。我不希望someotherdomain.com
能够从网址访问相同的数据。
我安装了 helmet ,但这并不是我想要的。 CORS似乎也不是答案。
有没有一种标准方法可以做到这一点?
更新:
这是我尝试用CORS做的事情。使用这个包: https://github.com/expressjs/cors
const cors = require('cors')
...
const corsOptions = {
origin: (process.env.NODE_ENV === 'development') ? 'http://localhost:3000' : 'https://example.com',
optionsSuccessStatus: 200 // some legacy browsers (IE11, various SmartTVs) choke on 204
}
然后在路线上:
server.get('/api/data', cors(corsOptions), (req, res) => {
Promise.resolve(getAPIData()).then(data => {
res.writeHead(200, {'Content-Type': 'application/json'})
return res.end(serialize(data))
}).catch((error) => {
console.log(error)
res.writeHead(200, {'Content-Type': 'application/json'})
return res.end(serialize({}))
})
})