JQuery $ .ajax.post到具有秘密API密钥的服务

时间:2011-05-20 10:22:20

标签: javascript jquery security api client-side

让我们假设有一项服务如下;

  

http://exmaple.com/service1/GetSomething?apikey= {API-钥匙进入-这里}

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

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

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

对此有何看法?

感谢。

3 个答案:

答案 0 :(得分:9)

代理。

将值发布到您的某个页面,然后从此页面在服务器端发出实际请求,然后返回您获得的值。

值得注意的是:您无法使用javascript发出跨域请求,主要是出于安全考虑,浏览器不允许这样做。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

我找到的最佳方法是为您的用户提供API_KEY和SECRET_KEY。

构建您的REST API请求,传递API_KEY,时间戳和拨打电话所需的任何其他参数。

使用PHP之类的脚本语言使用SECRET_KEY双向加密创建API_SIGNATURE变量,并将其附加到您的基本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以及你的iphone应用程序中的目标c。

非常简单。