如何正确设置和部署专用于我的前端的私有 API?

How do I properly setup and deploy a private API exclusively for my frontend?

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

中构建

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

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

所以我想知道,这是设计不好还是通常如此?如果我不希望这成为可能,我是否应该解决这个问题并尝试使 express-API 尽可能私有?如果是这样,开发和部署的通常最佳实践是什么/需要考虑的事项?我是否应该改变我的计划并在一个完全不同的架构上工作来满足我的期望/'bigger' 站点如何设法不允许官方、public 开发人员 API 之外的请求?

I think the only clean solution is that only my Vue.js-app would be able to perform such actions.

可从基于浏览器的应用程序中使用的 API 刚刚向全世界开放。您不能阻止从其他地方使用。这就是 WWW 的工作原理。您可以要求系统中的用户经过身份验证,并且在 API 提供任何数据之前为每个请求提供身份验证凭据(例如身份验证 cookie)。但是,即便如此,任何黑客都可以注册您的系统,获取授权凭证并将您的 API 用于他们自己的用途。你无法阻止它。

If I wanted this not to be possible, should I see to that issue and try to make the express-API as private as possible?

没有从基于浏览器的应用程序中使用的私有 API 这样的东西。在浏览器中运行的任何东西都不是私有的。

如果您正在考虑使用 CORs 保护来限制您的 API 的使用,那只会限制其他基于浏览器的应用程序,因为在浏览器内部强制执行 CORs 保护。使用您的 API 的任何外部脚本根本不受 COR 的约束。

How do 'bigger' sites manage to allow no requests outside the official, public developer API's?

较大的站点(例如 Google)有 API 需要某种开发人员凭据,并且该凭据带有特定的使用规则(一段时间内的最大请求数、最大数据使用,存储限制等...)。这些站点在其 API 服务器中实施代码以验证只有授权客户端(具有适当的开发人员凭据的人)正在使用 API 并且使用保持在提供该开发人员凭据的范围内。如果不是,API 将 return 某种 4xx 或 5xx 错误。

Someone will be able to call the /register route (with postman, curl etc.) to create an account an 'unofficial' way.

是的,这很有可能。如今,许多网站都使用验证码之类的东西来要求人工干预,然后才能成功创建帐户。这可以成功地防止完全自动创建帐户。但是,它仍然无法阻止某些开发人员手动创建帐户,然后获取该帐户凭据并将其与您的 API.

一起使用

When talking about web applications, the only truly private APIs are APIs that are entirely within your server (one part of your server calling something in another part of your server). These private APIs can even be http requests, but they must either not be accessible to the outside world or they must require credentials that are never available to the outside world. Since they are not available to the outside world, they cannot be used from within a browser application.

OK, that was a lot of things you cannot do, what CAN you do?

首先,保持私有 APIs 在服务器内部(不是从客户端发送)的应用程序设计是最好的。因此,如果您想实现一项需要调用多个 API 的功能,您希望私有化,那么请不要在客户端上实现该功能。在服务器上实现该功能。让客户端发出一个请求并获取一些数据或返回 HTML 然后它可以显示。在服务器上尽可能多地保留该功能的内部实现。

其次,您可以要求系统中用户的所有 API 使用身份验证凭据。虽然这不会阻止恶意使用,但它会给您更多的控制权,因为您可以跟踪使用情况、在发现滥用时暂停用户帐户等...

第三,您可以为面向 public 的 API 实施使用规则,例如每分钟的请求数、数据量等......您的实际 Web 应用程序永远不会超过如果超出,则一定是对 API 的一些无意使用。而且,您可以走得更远,检测您的客户端中不会发生的使用模式。例如,如果您看到一个 API 用户循环浏览数十个用户,请求他们的所有个人资料,并且您知道这是您的普通客户永远不会做的事情,您可以检测到这种使用类型并阻止它。