我如何阻止用户直接访问服务器的 API 而强制他们使用 UI?

How do I prevent a user from accessing a server's API directly and instead force them to use the UI?

更多的是理论问题,但我真的很好奇!

我有一个分为两部分的申请:

  1. 托管我的 UI
  2. 的 Apache 服务器
  3. Back-end 为来自 UI
  4. 的所有 http 请求提供服务

apache 服务代理从 UI 到服务器的所有 http 请求。因此,如果用户相当熟练,他们可以通过检查浏览器开发工具中的调用来对我们的 API 进行逆向工程。

因此,如何阻止用户直接使用服务器 API,而是强制他们使用 UI?

服务器无法确定调用是否来自 UI,因为用户可以从 UI 外部调用 myapp.com/apache-proxy/blah/blah/blah,apache 将获得请求并将其转发给服务器,服务器不知道它不是来自 UI.

我看到的选项是在 UI 的请求中注入一个 header,表示请求的来源是 UI。不过,这似乎已经成熟了。

对我来说,这更像是一个网络问题,因为我会在网络级别解决这个问题。如果您 运行 您的后端应用程序位于专用网络(或具有防火墙规则的 public 网络),您可以将后端主机配置为仅接受来自 Apache 服务器的通信。

这样最终用户无法直接连接到 API,因为 public 无法访问它。只有允许的 Apache 服务器才能与后端通信 API。这样,Apache 服务器充当最终用户(客户端)和后端 API 服务器之间的中介。

来自 AWS 的示例图表。

您可以让后端服务器在接受来自它们的任何请求之前要求对连接进行身份验证。然后使它只有 Apache 服务器才能以最终用户无法复制的方式成功进行身份验证。例如,通过在 Apache 和后端之间使用 SSL/TLS,其中后端要求使用客户端证书,然后向 Apache 颁发后端将接受的私有证书。然后最终用户将无法直接与后端进行身份验证。