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

时间:2015-12-05 23:33:58

标签: api security parse-platform

我打算使用付费服务,为用户提供域名和JS api / sdk的API密钥。如何确保只有该域和密钥的用户将被分配合同中的资源?

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

1 个答案:

答案 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:

  1. 在当前页面中包含一个远程JS(一个由您的服务器托管并由您的服务器提供)。
  2. 使用客户端&#34;公共密钥&#34;从远程JS初始化逻辑。 (对于Google Analytics,分析网站属性ID)
  3. 您可以以类似的方式处理您的问题:公开JS资源,实际上是由您的服务器生成的。我们假设您的服务名为http://example.com。您可以使用以下命令公开客户可以在其页面的<head>部分中包含的JS:

    <script src="http://example.com/cool_library_helper.js?api_key=XXXXXXXX"></script>

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

    1. 获取当前的浏览器URL(包含/加载外部帮助程序JS的域)。
    2. 传递的API密钥(作为GET参数传递给JS文件)。
    3. 生成(在服务器端)一个唯一的,安全的,散列的和盐渍的,基于时间的一次性令牌,仅用于调用服务上的辅助辅助API端点,让我们称之为/ api /为gettoken。
    4. 最后一步的API端点应该获取3条信息(最后一条信息几乎不可能被潜在的黑客欺骗),检查所有信息的有效性,并因此将最终的秘密令牌返回给客户端的应用程序,从现在开始,它现在可用于与其他服务API端点进行通信。

      这种方法的优点是,您提供给客户端的公钥只是最终用户交换它们用于与API通信的实际临时令牌的一种手段,这意味着您可以到期并撤消对您服务上任何临时令牌的访问权限。此外,您在服务(服务器端)验证调用域是否与API密钥配对,并且只有您将安全令牌提供给最终用户。

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

      PS:作为额外的阅读资源,我建议this answer