我认为唯一干净的解决方案是只有我的 Vue.js 应用程序才能执行此类操作。
可从基于浏览器的应用程序中使用的 API 只是向全世界开放。您不能阻止从其他地方使用。万维网就是这样运作的。在 API 提供任何数据之前,您可以要求对系统中的用户进行身份验证,并为每个请求提供身份验证凭据(例如身份验证 cookie)。但是,即便如此,任何黑客都可以注册您的系统,获取身份验证凭据并将您的 API 用于自己的用途。你无法阻止它。
如果我不希望这成为可能,我是否应该解决该问题并尝试使 express-API 尽可能私有?
不存在从基于浏览器的应用程序中使用的私有 API。在浏览器中运行的任何内容都不是私有的。
如果您正在考虑使用 CORs 保护来限制 API 的使用,那只会限制其他基于浏览器的应用程序,因为 CORs 保护是在浏览器内部实施的。任何使用您的 API 的外部脚本根本不受 COR 约束。
“更大”的网站如何设法不允许官方、公共开发人员 API 之外的请求?
较大的网站(例如 Google)的 API 需要某种类型的开发人员凭据,并且该凭据附带特定的使用规则(在某个时间段内的最大请求数、使用的最大数据量、存储限制等...)。这些站点在其 API 服务器中实施代码,以验证只有授权客户端(具有适当开发人员凭证的客户端)在使用 API,并且使用情况保持在提供该开发人员凭证的范围内。如果没有,API 将返回某种 4xx 或 5xx 错误。
某人将能够调用 /register 路由(使用邮递员、curl 等)以“非官方”方式创建帐户。
是的,这很有可能。如今,许多网站使用验证码之类的东西来要求人工干预,然后才能成功创建帐户。这可以成功防止完全自动创建帐户。但是,它仍然无法阻止一些开发人员手动创建帐户,然后获取该帐户凭据并将它们与您的 API 一起使用。
在谈论 Web 应用程序时,唯一真正私有的 API 是完全在您的服务器中的 API(服务器的一部分调用服务器另一部分的某些东西)。这些私有 API 甚至可以是 http 请求,但它们要么不能被外界访问,要么必须需要外界永远无法获得的凭证。由于它们对外部世界不可用,因此无法在浏览器应用程序中使用。
好吧,很多事情你不能做,你能做什么?
首先,将私有 API 保留在服务器内部(而不是从客户端发送)的应用程序设计是最好的。所以,如果你想实现一个需要调用多个 API 的功能,你希望是私有的,那么不要在客户端上实现该功能。在服务器上实现该功能。让客户端发出一个请求并获取一些数据或 HTML,然后它可以显示。在服务器上保留尽可能多的该功能实现的内部结构。
其次,您可以要求系统中用户的身份验证凭据用于所有 API 使用。虽然这不会阻止 rouge 的使用,但它会给您更多的控制权,因为您可以跟踪使用情况、在发现滥用行为时暂停用户帐户等...
第三,您可以为面向公众的 API 实施使用规则,例如每分钟的请求数、数据量等……您的实际 Web 应用程序永远不会超过,所以如果超过了,那么一定是一些意外API的使用。而且,您可以走得更远,检测在您的客户端中没有发生的使用模式。例如,如果您看到一个 API 用户在几十个用户之间循环,请求他们的所有个人资料,并且您知道这是您的常规客户从未做过的事情,您可以检测到这种使用类型并阻止它。