【问题标题】:How do I properly setup and deploy a private API exclusively for my frontend?如何为我的前端正确设置和部署专用 API?
【发布时间】:2021-09-01 23:12:32
【问题描述】:

我目前正在开发一个 Web 应用程序。客户端使用 Vue.js 设计,服务端应用使用 node.js 和 express。

到目前为止,我计划将客户端网站和 node.js-app 部署在同一台服务器上。两者都将通过两个不同的唯一域进行寻址。服务器将使用 nginx 手动设置。

现在的问题是,此解决方案不会阻止用户向为其创建的客户端之外的服务器发送请求。有人将能够调用 /register 路由(使用邮递员、curl 等)以“非官方”方式创建帐户。我认为唯一干净的解决方案是只有我的 Vue.js-app 才能执行此类操作。但是,由于服务器和客户端都是两个不同的环境/应用程序,因此必须设置某种跨域请求机制(例如 cors)。

所以我想知道,这是设计不好还是通常那样?如果我不希望这成为可能,我是否应该解决这个问题并尝试使 express-API 尽可能私有?如果是这样,开发和部署的通常最佳实践/要考虑的事情是什么?我是否应该改变我的计划并根据我的期望开发一个完全不同的架构/“更大”的网站如何设法不允许官方、公共开发人员 API 之外的请求?

【问题讨论】:

    标签: node.js rest server


    【解决方案1】:

    我认为唯一干净的解决方案是只有我的 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 用户在几十个用户之间循环,请求他们的所有个人资料,并且您知道这是您的常规客户从未做过的事情,您可以检测到这种使用类型并阻止它。

    【讨论】:

      猜你喜欢
      • 2021-09-07
      • 1970-01-01
      • 2020-08-12
      • 2020-01-16
      • 2021-01-02
      • 2020-07-25
      • 1970-01-01
      • 2017-05-05
      • 1970-01-01
      相关资源
      最近更新 更多