【问题标题】:JQuery $.ajax.post to a service with secret API KeyJQuery $.ajax.post 到具有秘密 API 密钥的服务
【发布时间】:2011-05-20 10:22:19
【问题描述】:

让我们假设有如下服务;

http://exmaple.com/service1/GetSomething?apikey={api-key-goes-here}

我的 api 密钥是:96a143c8-2f62-470c-b81f-dec5fc271873

所以我们将调用 > http://exmaple.com/service1/GetSomething?apikey=96a143c8-2f62-470c-b81f-dec5fc271873 链接,它会以 JSON 形式返回响应。

当我使用 JQuery(或任何其他客户端 JavaScript 库)使用它时,该密钥将如何安全?我在想,我认为没有办法。如果我要通过客户端调用来调用该服务,它将是我们的公开服务。

对此有什么想法吗?

谢谢。

【问题讨论】:

    标签: javascript jquery security api client-side


    【解决方案1】:

    做一个代理。

    将值发布到您的一个页面,然后从该页面在服务器端发出真正的请求,然后返回您获得的值。

    注意:你不能使用javascript进行跨域请求,主要是浏览器出于安全原因不允许这样做。

    【讨论】:

    • 完全正确! +1! (注解:可以使用 JSONP 模拟跨域请求)
    • @BrunoLM 好的,我部分理解。 'You cannot make a cross-domain request with javascript' 所以根据这句话,exmaple.com/service1/…服务不能从example.org用客户端代码调用。对吗?
    • @BrunoLM 还假设我创建了一个服务来在我的应用程序中使用该服务。这个服务 url 是 example.co.uk/MyService 这个服务将包括我的 api 密钥和所有这些东西,它会返回结果。因此,该服务将成为我在客户端代码中使用的服务。什么会阻止 smbdy 使用该服务?例如,与提琴手?
    • @BrunoLM 哦,对不起。我忘了谢谢你的回答。谢谢:)
    • @tugberk,1. 对。 2. 您的 api 密钥应该只在您的代理上,并且您将从 javascript 提交所有 other 值到您的代理,您的代理将发出请求然后返回该值。这样人们就不会知道你的钥匙。但这并不妨碍他们请求您的代理,但您可以验证请求的来源。
    【解决方案2】:

    从客户端角度保护它的唯一方法是将请求代理到服务器上的 API 并将该密钥添加到您的应用中。

    【讨论】:

    • 谢谢。同样的问题:假设我创建了一个服务来在我的应用程序中使用该服务。这个服务 url 是 example.co.uk/MyService 这个服务将包括我的 api 密钥和所有这些东西,它会返回结果。因此,该服务将成为我在客户端代码中使用的服务。什么会阻止 smbdy 使用该服务?例如,与提琴手?据我了解,任何能够查看我的 html 标记源的人都可以使用该服务。我的方向正确吗?
    • 这是另一个问题。事实上,API 密钥将被有效地屏蔽,因为代理将自己处理对外部 Web 服务的请求。但是阅读您的 HTML 并使用适当参数调用您的代理的人应该能够使用来自外部服务的结果。现在,这只是“基本”安全问题。如何防止用户调用网页并授权另一个网页...例如,会话管理可以在会话中为特定用户使用令牌来解决问题。或者根据您的要求,您可以通过 IP 限制对多项检查的访问
    • 嗯,创建令牌听起来很合理。因此,当调用网页时,我可以创建一个令牌,该令牌将在页面和我的服务之间共享。因此,我可以将令牌传递给我的服务并进行比较。或者,基本上我可以从我的服务访问会话集合以读取我的令牌的特定会话?我可以吗?
    • 当客户进行身份验证或到达网站的特定区域时,打开会话。在那个会话中,您可以允许一个特定的令牌(我会添加 TTL)。在您的服务中,检查会话中令牌的可用性。但是,这并不能阻止您通过限制每个...的请求数来防止垃圾邮件(包括小时、分钟、秒、十年等)
    【解决方案3】:

    我发现最好的方法是给你的用户一个 API_KEY 和一个 SECRET_KEY。

    构建您的 REST API 请求,传递 API_KEY、时间戳和进行调用所需的任何其他参数。

    使用像 PHP 这样的脚本语言创建一个 API_SIGNATURE 变量,使用您的 SECRET_KEY 进行双向加密,并将其附加到您的基本 url,这就是您发出的请求。

    现在任何人都可以看到该请求,这就是您将时间戳作为参数放入的原因。基本上,您可以设置一个仅处理不到一分钟的请求的约束。

    例子:(用脚本语言做这部分)

    $API_BASE_URL="http://api.yourdomain.com/1.1/comments.json?api_key=2002&timestamp=2323234544&id=4";
    $API_KEY=300;
    $API_SIGNATURE=hash_hmac('sha256', API_BASE_URL, API_KEY);
    $API_URL=$API_BASE_URL.'&api_signature='.$API_SIGNATURE;
    

    --

    现在在您的 jquery ajax url 中:使用 PHP 回显 $API_URL。

    --

    在您的 API 中,当您收到请求时,您会根据 API_KEY 查找用户帐户并获取他们的 SECRET_KEY 并解密签名并确保与传入的内容相匹配。如果通过了,现在检查时间戳并确保请求是不到一分钟。

    您还可以在处理请求之前进行速率限制和一大堆其他事情。

    就是这样。


    还有人说浏览器不允许跨域请求。如果您正在请求 json,这是正确的,但您可以使用 jsonp 解决这个问题。


    hash_hmac 可用于许多编程和脚本语言。因此,如果您开发一个 API,您可以使用 PHP 在 Web 上使用它,并在您的 iPhone 应用程序中使用目标 c。

    很简单。

    【讨论】:

      猜你喜欢
      • 2014-01-05
      • 2014-05-25
      • 1970-01-01
      • 2019-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-09
      • 2018-07-04
      相关资源
      最近更新 更多