Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.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
使用AJAX从我自己的消费者网站安全地访问私有API_Ajax_Api_Security_Backend_Frontend - Fatal编程技术网

使用AJAX从我自己的消费者网站安全地访问私有API

使用AJAX从我自己的消费者网站安全地访问私有API,ajax,api,security,backend,frontend,Ajax,Api,Security,Backend,Frontend,对于如何最好地保护一个暂时保持私有的API,可以使用一些建议。后端API已经开发完成,将位于其自己的系统中。前端消费者网站将通过专用API密钥访问此API。这都是服务器端代码。然而,一个新的需求已经被提出:我们的网站还需要发出AJAX请求来生成代码。我不想在javascript代码中公开API调用或令牌,所以我试图找出一些选项。一种方法是在前端服务器端创建一个REST控制器,然后由javascript代码调用,但这将有效地规避API密钥安全措施,因此不是真正的解决方案 那么,这方面的一般做法是什

对于如何最好地保护一个暂时保持私有的API,可以使用一些建议。后端API已经开发完成,将位于其自己的系统中。前端消费者网站将通过专用API密钥访问此API。这都是服务器端代码。然而,一个新的需求已经被提出:我们的网站还需要发出AJAX请求来生成代码。我不想在javascript代码中公开API调用或令牌,所以我试图找出一些选项。一种方法是在前端服务器端创建一个REST控制器,然后由javascript代码调用,但这将有效地规避API密钥安全措施,因此不是真正的解决方案

那么,这方面的一般做法是什么?我认为理想情况下(我正朝着这个方向发展,从时间角度来看,目前还不可行),我会使用OAuth令牌来验证请求,并让一些API调用(提取一般信息)不需要任何形式的身份验证等,但考虑到AJAX的要求,即使这样也会有一些问题。是否有某种方法可以让客户端javascript和相关的AJAX调用保持安全

所有这些都是说——我现在不知道在这里该做什么

谢谢


编辑:当前的想法是在前端创建可以通过ajax访问的控制器,ajax向API发送无风险的回迁,对于有风险的控制器,则依赖于当前用户验证(例如用户登录)。此外,登录不会是AJAX风格的请求,因此登录应该是一个可靠的安全测试。

您可以开发一个处理程序来接受AJAX请求,并使用非公开代码中其他地方采用的正常访问令牌方法将其传递给私有API

这样,就不会在javascript中公开令牌或API。您可以在处理程序中构建一个API调用白名单,以便它只处理(大概)来自前端的良性AJAX请求。这个处理程序既是坏请求的防火墙,也是保护私有API真正机制的一种方法

如果任何API方法对数据具有潜在危险或破坏性,则可以(并且应该)与公共网站的身份验证机制结合使用

模型(PHP):

$whitelist=数组(
“SomeApiCallPublicAlias”=>“RealApiMethod”,
'AnotherPublicAlias'=>'SomeSafeApiMethod'
);

$call=$_POST['call'];//我相信这就是我上面提到的“前端服务器端的额外控制器”方法。换句话说,我可以创建控制器,将所有安全的调用传递给服务器。问题是会有一些“潜在的危险呼叫”需要通过AJAX进行,因此仅仅列出/容纳某些呼叫并不理想。是的,这是您在OP中提到的方法之一。您可以将此方法与前端使用的任何身份验证相结合——可能,您只会在响应某些用户交互时发出“危险”请求,并且可能会首先对该用户进行身份验证。您的“额外控制器”将实现前端身份验证机制。考虑到这里使用的技术,网络,这一切都是必然的结果;我认为没有“另一种方式”。我敢肯定,你会反复使用这种方法。嘿,克里斯,你的第一个回答让我激动不已,我只是编辑了这个问题,没有看到你的回答。感谢您的意见,我将接受您的回答,因为这是我目前正在实施的方法。谢谢你帮我想清楚这件事。
$whitelist = array(
  'SomeApiCallPublicAlias'=>'RealApiMethod',
  'AnotherPublicAlias'=>'SomeSafeApiMethod'
);
$call = $_POST['call']; // <-- SomeApiCallPublicAlias
if (!array_key_exists($call, $whitelist))
  die('permission denied');
$data= $_POST['data'];

// hook in to the private API, pass the data, return the response
$response = make_private_api_call($whitelist[$call], $data);
die(json_encode($response));