【发布时间】:2011-09-06 08:43:55
【问题描述】:
我正在构建一个 API 来为网站提供支持以及使应用程序可用,尽管这是我的第一个 API,我发现了一些问题领域,并希望在可能的情况下获得一些建议/提示。
我计划让外部 API 使用用户名/密码和 API 密钥进行身份验证,但是,我真的不希望内部 API 拥有其中任何一个。这是因为我希望将来可能分发脚本,并且不希望有人找到任何用于访问内部 API 的访问代码,他们可以使用这些访问代码来访问外部 API(任何站点的使用脚本)。
理想情况下,我希望将这两个 API 放在一起,以便更轻松地管理它们。
为了保护对 API 的直接访问,以便没有人可以尝试直接包含它(在 .htaccess 中):
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^.*$ - [R=401,L]
为了访问外部 API,我需要执行以下操作(在 PHP 中):
$url = "http://www.mydomain.com/script/api.php";
$username = "username";
$password = "password";
$apikey = "12345678901234567890";
$postfields = array();
$postfields["username"] = $username;
$postfields["password"] = md5($password);
$postfields["apikey"] = md5($apikey);
$postfields["action"] = "getclients";
$postfields["format"] = "json";
$query_string = "";
foreach ($postfields AS $k=>$v) $query_string .= "$k=".urlencode($v)."&";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $query_string);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$jsondata = curl_exec($ch);
if (curl_error($ch)) die("Connection Error: ".curl_errno($ch).' - '.curl_error($ch));
curl_close($ch);
$array_out = json_decode($jsondata);
但是,我不确定(确切地)在我的后端中包含内部 API 的最佳方式 - 我曾认为也许我可以执行以下操作(在 PHP 中):
$postfields = array();
$postfields["action"] = "getclients";
$postfields["format"] = "json";
ob_start();
include("script/api.php");
$array_out = json_decode(ob_get_contents());
ob_end_flush();
但是,由于我在 API 中发送标头 header ("content-type: text/json charset=utf-8");,Firefox 只希望我保存输出而不是传递它。我试过不发送标头,但是所有 API 变量都通过包含它的页面传递 - 这是我不想要的。
我的问题是:
- 有没有更好的方法在 PHP 中获取 JSON 输出(内部访问)?
- .htaccess 文件是否足以保护 API 不被第三方网站包含?
- 外部身份验证是否足够?
- 如果我计划分发脚本,访问内部 API 是否是正确的方法?
非常感谢!
【问题讨论】:
-
[OR]与您使用它的方式不同。所有RewriteCond都适用于下一个RewriteRule,因此不需要“或”。