Node.js 处理前端API调用的最佳方法
好的,我有一个用Nuxt JS构建的前端应用程序,使用Axios对我的REST API进行请求(单独) 如果用户在网站上进行搜索,那么API URL在XMLHttprequests中是可见的,因此每个人都可以使用API 最好的方法是什么,这样只有通过我的网站进行搜索的用户才能访问API,而直接访问URL的用户则会被拒绝。我想使用某种代币系统,但最好的方法是什么?JWT?(用户从不登录,因此没有“身份验证”) 谢谢Node.js 处理前端API调用的最佳方法,node.js,express,vue.js,axios,nuxt.js,Node.js,Express,Vue.js,Axios,Nuxt.js,好的,我有一个用Nuxt JS构建的前端应用程序,使用Axios对我的REST API进行请求(单独) 如果用户在网站上进行搜索,那么API URL在XMLHttprequests中是可见的,因此每个人都可以使用API 最好的方法是什么,这样只有通过我的网站进行搜索的用户才能访问API,而直接访问URL的用户则会被拒绝。我想使用某种代币系统,但最好的方法是什么?JWT?(用户从不登录,因此没有“身份验证”) 谢谢 依我看,您不能阻止其他非法客户端访问您的 后端,正如您所描述的,官方客户端和其他非
// protect /api calls to only be originated from 'process.env.API_ALLOW_HOST'
app.use(api.allowOnlySameDomainRequests());
...
const allowHostname = process.env.API_ALLOW_HOST ||'localhost';
exports.api = {
...
allowOnlySameDomainRequests: (req, res, next) => {
if(req.url.startsWith('/api') && req.hostname === allowHostname) {
// an /api call, only if request is the same
return next();
} else if (!req.url.startsWith('/api')) {
// not an /api call
return next();
}
return res.redirect('/error?code=401');
},
...
};
在我们的例子中,我们使用Oauth2(Google sign-through passportJs)登录用户,我总是有一个由Oauth2成功重定向提供的用户id,该用户id与apikey一起在一个标头中传递给API。。。在服务器中,我检查该用户ID权限,并允许或不允许执行该操作
但即使是我也在努力寻找更好的东西。我见过几个javascript前端应用程序使用对后端的调用,但它们使用Bearer
token
作为一个好奇的用户,你会看到所有API的路径以及它们是如何组成的,但在我的例子中,你只看到对expressJs后端的调用,只有在那里我才转发到真正的API。。。我不知道这是否只是“更多的工作”,但以这种方式处理问题似乎更“安全”一些。因此,基本上,您希望确保人们使用浏览器访问您的API,如果是这种情况,我有个坏消息告诉您,如果人们愿意,他们总会找到一种方法绕过它,使用reCAPTCHA之类的工具可以确保真正的用户正在访问您的API。IP限制可能是一种方式,因为我将前端托管在一个单独的端口上。因此,只允许在同一台机器上从该端口直接调用(例如,API在端口5000上运行,前端应用程序在5001上运行。我可以说,只接受来自5000的调用吗?当然,您可以隔离您的API,只接收来自前端应用程序的调用,那么,您将如何避免让非浏览器访问前端?至少前端只返回呈现的组件(带Nuxt的SSR),所以我想这会让获取数据变得更加困难。你必须抓取网站。但是我想,如果你真的想,你仍然可以通过这种或那种方式获取数据。我只是想让它变得更加困难,然后打电话给apias我说,你不能回避它,只是让它变得更加困难,对你来说,一个简单的方法就是放置一个reCAPTCHA。谢谢你的回复e、 我想我会像你说的那样做,并专注于其他事情。但我会看看是否可以在标题中实现关键更改,以使其他人更难使用。我尝试保护它的主要原因是因为后端的某些功能会调用具有请求限制的服务。因此我希望尽可能地使其难以使用其他人对我的限制嗤之以鼻当然,你可以尝试一些中间件/框架来限制请求。已经应用了限制!我想我可能只是有点偏执,这是一件事吗?:D什么是“最好的”如果有的话。处理标题键?我以前和你一样。我理解你。但现在,我会让事实驱使我处理事情。我建议你集中处理其他重要的功能需求,而不是非功能性需求,这不会阻碍你前进。