如何防止用户直接访问服务器的API,并强制他们使用UI?

如何防止用户直接访问服务器的API,并强制他们使用UI?,api,authentication,http-headers,httprequest,Api,Authentication,Http Headers,Httprequest,更多的是一个理论问题,但我真的很好奇 我的申请分为两部分: 托管我的UI的Apache服务器 为来自UI的所有http请求提供服务的后端 apache服务代理从UI到服务器的所有http请求。因此,如果用户相当熟练,他们可以通过检查浏览器开发工具中的调用来反向工程我们的API 因此,如何防止用户直接使用服务器API,而强制他们使用UI 服务器无法确定调用是否来自UI,因为用户可以从UI外部调用myapp.com/apache-proxy/blah/blah/blah/blah,apache将获取

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

我的申请分为两部分:

托管我的UI的Apache服务器 为来自UI的所有http请求提供服务的后端 apache服务代理从UI到服务器的所有http请求。因此,如果用户相当熟练,他们可以通过检查浏览器开发工具中的调用来反向工程我们的API

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

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


我看到的选项是从UI向请求中注入一个头,它将请求的来源指示为UI。不过,这似乎是开发的时机

对我来说,这更像是一个网络问题,因为我会在网络层面解决这个问题。如果使用防火墙规则在专用网络或公共网络上运行后端应用程序,则可以将后端主机配置为仅接受来自Apache服务器的通信

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

来自AWS的示例图


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

首先为什么要限制用户直接访问API?他们不应该使用API做任何他们在应用程序中做不到的事情。完全同意-这是一个虚假的要求。我想我会得到一个构建它的请求,因此最终用户必须为API的便利性付费。我想你的意思是将后端服务器配置为只接受来自Apache服务器的连接,而不是客户端机器上运行的UI。也许我误解了你的答案,但现在,出于设计,来自UI的所有客户端请求总是通过url中的路径参数通过Apache代理到后端服务器,如myapp.com/proxy-to-Apache/blah。没有什么可以阻止用户找出答案并将其调用代理到Apache,在这种情况下,服务器将不知道调用的来源。明白了,所以您确实想要强制用户使用web浏览器进行交互。我认为您希望确保请求通过Apache服务器传递,而不是通过点击公开的API绕过请求。也许我们应该退一步。你想通过这样做实现什么?正是@Cyph。所以,这是我从商业方面得到的一个要求。我们的应用程序验证内容,企业不希望用户提交要验证的内容过于方便。除了像验证码或行为分析之类的东西作为对浏览器另一端用户的验证之外,我不知道还有其他方法。这是许多公司在处理在线欺诈时遇到的一个问题。例如,通过直接发布购买数据绕过商户结账,自动测试被盗信用卡信息的有效性。因此,您可以尝试capthca或行为监视脚本,或者有一些TOS策略规定您必须使用UI,如果您能够检测到绕过它们的用户,则可以禁止它们。