如何为每个域每个用户设置安全的API密钥

如何为每个域每个用户设置安全的API密钥,api,security,parse-platform,Api,Security,Parse Platform,我计划提供付费服务,用户将获得一个域的API密钥和一个JSAPI/sdk。我如何确保只有此域和密钥的用户才能在合同中分配资源 我将使用解析作为后端。我最担心的是欺骗IP流量以从我的服务中获得免费的服务器资源。第1部分: (前言,或“为什么你不应该在意”) 正如您提到的,您将使用PARSE.com作为后端——让我们来看看这个产品是如何解决同样的问题的,同时为开发人员提供服务: 他们给你两个“公共”密钥,你把它们放在他们提供的JSSDK中。通过查看页面的HTML源代码,开发人员web应用程序的任何访

我计划提供付费服务,用户将获得一个域的API密钥和一个JSAPI/sdk。我如何确保只有此域和密钥的用户才能在合同中分配资源


我将使用解析作为后端。我最担心的是欺骗IP流量以从我的服务中获得免费的服务器资源。

第1部分:

(前言,或“为什么你不应该在意”)

正如您提到的,您将使用PARSE.com作为后端——让我们来看看这个产品是如何解决同样的问题的,同时为开发人员提供服务:

他们给你两个“公共”密钥,你把它们放在他们提供的JSSDK中。通过查看页面的HTML源代码,开发人员web应用程序的任何访问者都可以看到这些密钥。理论上,任何访问者都可以通过复制粘贴这些密钥并重用开发人员的JS文件来创建其服务的“副本”

Parse对此并不关心,也不应该关心,因为它们只是提供了一种达到目的的方法。它们让您可以使用Parse作为后端构建一个功能齐全的web应用程序,但它们不关心您如何确保它只是您的web应用程序与Parse api通信。它们还通过API键限制/跟踪对请求的使用,API键与您的问题相关

JavaScript本质上是不安全的(因为它是客户端语言而不是服务器端)。开发人员无法确保恶意最终用户不会从页面源获取API密钥,并使用它们与解析项目通信(至少,如果没有某种内部代理隧道脚本,它将充当客户端应用程序和“服务器到服务器”中实际解析API调用之间的中间人)方式,而不向过程中的最终用户公开解析客户机密钥)

这就是说,完全基于“客户端”的web应用程序的架构应始终能够预见此类恶意用户,例如,在最终用户未经身份验证的情况下,不应向其公开任何“私有”资源(请参阅中有关解析ACL的更多信息)

考虑到上述信息,仍然有一种方法可以确保给定的API密钥仅由其指定给的域使用,尽管不是那么容易:

第二部分:

(在
-“谷歌分析方式”中使用外部.js的实例)

让我们想想另一个流行的基于web的服务是如何工作的——Google Analytics(或任何其他分析服务)。他们给你一段JS,基本上是这样做的:

  • 在当前页面中包含一个远程JS(由服务器托管并由服务器提供)
  • 使用客户端的“公钥”(对于Google Analytics,是Analytics Web属性ID)从远程JS初始化逻辑
  • 您可以用类似的方式解决问题:公开一个JS资源,它实际上是由您的服务器动态生成的。假设你的服务被呼叫了。您可以公开一个JS,您的客户端可以使用以下方法将其包含在其页面的
    部分中:

    这个JS资源只是服务器上的一个屏蔽动态脚本,所以您可以在其中执行任何必要的安全计算。该脚本至少应:

  • 获取当前浏览器URL(包含/加载外部帮助程序JS的域)
  • 传递的API键(作为GET参数传递到JS文件)
  • 生成(在服务器端)一个唯一的、安全的、经过哈希和盐析的、基于时间的一次性令牌,该令牌将仅用于调用服务上的辅助助手API端点,我们将其命名为/API/getToken
  • 最后一步中的API端点应该获取这3条信息(最后一条信息对于潜在的黑客来说几乎不可能欺骗),检查所有信息的有效性,然后将最终的秘密令牌返回到客户端的应用程序,从现在起,它可以使用该令牌与其他服务API端点通信

    这种方法的优点是,您提供给客户机的公钥只是最终用户将其交换为实际临时令牌的一种手段,他将使用该令牌与您的API通信,这意味着您可以过期并撤销对服务上任何临时令牌的访问权。此外,您正在服务(服务器端)中验证调用域是否与API密钥配对的域匹配,并且只有这样您才能将安全令牌提供给最终用户

    不太理想,但这和客户端应用程序一样安全

    附言:作为额外的阅读资源,我推荐