Node.js 处理前端API调用的最佳方法

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?(用户从不登录,因此没有“身份验证”) 谢谢 依我看,您不能阻止其他非法客户端访问您的 后端,正如您所描述的,官方客户端和其他非

好的,我有一个用Nuxt JS构建的前端应用程序,使用Axios对我的REST API进行请求(单独)

如果用户在网站上进行搜索,那么API URL在XMLHttprequests中是可见的,因此每个人都可以使用API

最好的方法是什么,这样只有通过我的网站进行搜索的用户才能访问API,而直接访问URL的用户则会被拒绝。我想使用某种代币系统,但最好的方法是什么?JWT?(用户从不登录,因此没有“身份验证”)

谢谢

  • 依我看,您不能阻止其他非法客户端访问您的 后端,正如您所描述的,官方客户端和其他非法客户端对您的后端有相同的了解
  • 但是您可以通过一些方法使非法客户端更难访问您的后端,例如发布所有请求标题中的特殊密钥标题中的30分钟更改令牌,以及客户端IP限制服务器端API
  • 如果搜索API的安全性非常重要,请通过登录对其进行身份验证;如果没有,就让它去吧,因为它不在你的关键路径上。让我们关注其他重要的事情
  • 我在同一条船上,我当前的设置实际上是在VueJs中,但在开始StackOverflow之前,我开发了一种方法,前端调用服务器,然后服务器调用API,因此在浏览器中,您只能看到对服务器层的调用,唯一的限制是调用必须来自同一主机名

    后端由expressJs处理,前端由VueJs处理

    // 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什么是“最好的”如果有的话。处理标题键?我以前和你一样。我理解你。但现在,我会让事实驱使我处理事情。我建议你集中处理其他重要的功能需求,而不是非功能性需求,这不会阻碍你前进。