Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JQuery$.ajax.post到具有机密API密钥的服务_Javascript_Jquery_Security_Api_Client Side - Fatal编程技术网

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

Javascript JQuery$.ajax.post到具有机密API密钥的服务,javascript,jquery,security,api,client-side,Javascript,Jquery,Security,Api,Client Side,让我们假设有一个服务,如下所示 {api密钥在这里} my api密钥是:96a143c8-2f62-470c-b81f-dec5fc271873 因此,我们将调用>link,它将以JSON的形式返回响应 当我使用JQuery(或任何其他客户端JavaScript库)时,该密钥如何安全?我在想那件事,我想那是不可能的。如果我要通过客户端呼叫对该服务进行呼叫,这将是我们的公开服务 有什么想法吗 谢谢。请代理 将这些值发布到您的一个页面,并从此页面在服务器端发出真正的请求,然后返回您获得的值 注意:

让我们假设有一个服务,如下所示

{api密钥在这里}

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

因此,我们将调用>link,它将以JSON的形式返回响应

当我使用JQuery(或任何其他客户端JavaScript库)时,该密钥如何安全?我在想那件事,我想那是不可能的。如果我要通过客户端呼叫对该服务进行呼叫,这将是我们的公开服务

有什么想法吗

谢谢。

请代理

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


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

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

我发现的最佳方法是给用户一个API密钥和一个密钥

构建RESTAPI请求,传入API_键、时间戳和进行调用所需的任何其他参数

使用像PHP这样的脚本语言,使用带有密钥的双向加密创建一个API_签名变量,并将其附加到基本url,这就是您在请求时发出的内容

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

示例:(使用脚本语言编写此部分)

--

现在在jQueryAjax url中:使用PHP呼出$API\uURL

--

在您的API中,当您收到请求时,您可以根据API_密钥查找用户帐户,获取他们的密钥,解密签名,并确保与传入的内容匹配。如果通过,现在检查时间戳,并确保请求时间少于一分钟

在处理请求之前,您还可以执行速率限制和一系列其他操作

就这样


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


hash_hmac在许多编程和脚本语言中都可用。因此,如果你开发了一个API,你可以在web上使用PHP,在iphone应用程序中使用objective c


非常简单。

完全正确+1.(注意:您可以使用JSONP模拟跨域请求)@BrunoLM好的,我部分理解这一点。”您不能使用javascript发出跨域请求,因此根据这句话,不能使用客户端代码从中调用服务。是吗?@BrunoLM还假设我创建了一个服务来在我的应用程序中使用该服务。这个服务url是这个服务将包括我的api密钥和所有的东西,它将返回结果。因此,该服务将是我在客户端代码中使用的服务。什么将阻止smbdy使用该服务?例如,和提琴手一起?@BrunoLM ow,对不起。我忘了感谢你的回答。谢谢:)@tugberk,1。正确的。2.您的api密钥应该仅在代理上,并且从javascript向代理提交所有其他值,代理将发出请求,然后返回值。这样人们就不会知道你的钥匙了。但这并不能阻止他们请求您的代理,但您可以从请求的来源进行验证。谢谢。同样的问题:假设我创建了一个服务来在我的应用程序中使用该服务。这个服务url是example.co.uk/MyService这个服务将包括我的api密钥和所有的东西,它将返回结果。因此,该服务将是我在客户端代码中使用的服务。什么将阻止smbdy使用该服务?例如,与小提琴手?据我所知,任何能够查看源代码html标记的人都可以使用该服务。我的方向正确吗?那是另一个问题。事实上,API密钥将被有效屏蔽,因为代理将自己处理对外部Web服务的请求。但是,阅读HTML并使用适当参数调用代理的人应该能够使用外部服务的结果。现在,这只是“基本”安全问题。如何防止用户调用网页并授权另一个网页。。。例如,会话管理可以在会话中为特定用户使用令牌。或者根据您的要求,您可以通过IPhmm限制对一些检查的访问,从而创建合理的令牌。因此,当调用web页面时,我可以创建一个令牌,该令牌将在页面和我的服务之间共享。因此,我可以将令牌传递给我的服务并比较它们。或者,基本上我可以从我的服务访问会话集合来读取令牌的特定会话?我可以吗?当客户验证自己或到达站点的特定区域时,打开会话。在该会话中,您可以允许一个特定的令牌(我将使用TTL添加)。在您的服务中,检查会话中令牌的可用性。但是,这并不能通过限制每个用户的请求数量来阻止垃圾邮件。。。(包括小时、分钟、秒、十年等)
$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;