我打算使用付费服务,为用户提供域名和JS api / sdk的API密钥。如何确保只有该域和密钥的用户将被分配合同中的资源?
我将使用Parse作为后端。我最关心的是欺骗IP流量以从我的服务中获取免费的服务器资源。
答案 0 :(得分:2)
第1部分:
(前言,或"为什么你不应该关心")
正如您提到的那样,您将使用Parse.com作为后端 - 让我们看一下该产品如何处理同样的问题,同时为开发人员提供服务:
他们给你两个" public"您放在他们提供的JS SDK中的密钥。通过查看页面的HTML源代码,理论上任何访问者都可以创建一个"副本&他的服务是通过复制粘贴这些密钥并重用开发人员的JS文件。
Parse并不关心这一点,他们不应该这样做,因为他们只是提供了达到目的的手段。它们为您提供了构建功能齐全的Web应用程序的可能性,使用Parse作为后端,但他们并不关心如何确保它只是与Parse API通信的Web应用程序。他们还通过API密钥限制/跟踪您的请求的使用情况 - 与您的问题相关的事情。
JavaScript本质上是不安全的(因为它是客户端语言,而不是服务器端)。开发人员无法确保恶意最终用户无法从页面源获取其API密钥并使用它们与其Parse项目进行通信(至少,没有某种内部代理隧道脚本)作为客户端应用程序与实际Parse API调用之间的中间人,以服务器到服务器"方式,没有将Parse客户端密钥暴露给最终用户过程)。
这就是说,一个完全"客户端"基于Web的应用程序应始终以预期此类恶意用户的方式进行架构,例如:没有"私人"资源应该在没有首先进行身份验证的情况下向最终用户公开(请参阅official JS guides中的解析ACL)。
鉴于上述信息,仍然有一种方法可以确保给定的API密钥仅由它所使用的域使用,尽管不是那么容易:
第2部分:
(在<head>
中使用外部.js的实际示例 - &#34; Google Analytics方式&#34;)
让我们想一想另一种流行的基于网络的服务是如何运作的 - Google Analytics(或任何其他分析服务)。他们给你一块基本上做到这一点的JS:
您可以以类似的方式处理您的问题:公开JS资源,实际上是由您的服务器生成的。我们假设您的服务名为http://example.com。您可以使用以下命令公开客户可以在其页面的<head>
部分中包含的JS:
<script src="http://example.com/cool_library_helper.js?api_key=XXXXXXXX"></script>
这个JS资源只是服务器上的一个屏蔽动态脚本,所以你可以在里面做任何必要的安全计算。至少,该脚本应该:
最后一步的API端点应该获取3条信息(最后一条信息几乎不可能被潜在的黑客欺骗),检查所有信息的有效性,并因此将最终的秘密令牌返回给客户端的应用程序,从现在开始,它现在可用于与其他服务API端点进行通信。
这种方法的优点是,您提供给客户端的公钥只是最终用户交换它们用于与API通信的实际临时令牌的一种手段,这意味着您可以到期并撤消对您服务上任何临时令牌的访问权限。此外,您在服务(服务器端)验证调用域是否与API密钥配对,并且只有您将安全令牌提供给最终用户。
不理想,但这与客户端应用程序一样安全。
PS:作为额外的阅读资源,我建议this answer。