簡體   English   中英

內部+外部API-保護API並調用內部API

[英]internal + external API - securing the API and calling the internal API

盡管這是我的第一個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();

但是,由於我正在發送標header ("content-type: text/json charset=utf-8");header ("content-type: text/json charset=utf-8"); 在API中,Firefox只希望我保存輸出而不是傳遞輸出。 我試過不發送標頭,但是所有API變量都會通過包含標頭的頁面傳遞-這是我不想要的。

我的問題是:

  • 有沒有更好的方法來在PHP(內部訪問)中獲取JSON輸出?
  • .htaccess文件是否足以保護API,使其不被第三方網站包含?
  • 外部身份驗證是否足夠?
  • 如果我計划分發腳本,對內部API的訪問是否是正確的方法?

提前謝謝了!

在您的.htaccess[OR]無法按照我認為的方式使用。 所有RewriteCond適用於下一個RewriteRule ,因此不需要“或”。 其次,您還需要規則以將API請求推送到某種調度程序文件,例如:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* dispatcher.php

我認為通過cURL等內部調用您的API函數沒有意義-尤其是因為您必須通過身份驗證等。在我看來,擁有(面向對象)'API的集合更有意義在內部可以直接調用,例如API::getClients() 然后構建一個調度程序腳本,將所有傳入的Ajax請求推送到該腳本。 該腳本將執行以下操作:

  • 檢查身份驗證
  • 找出要查詢的API
  • [檢查參數](如果您在調度程序中實施此操作,則取決於您)
  • 調用API函數
  • 返回結果為JSON

希望你能抓住我的漂流:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM