2013-12-05 1 views
0

Итак, мы хотели создать частный API, который позволил бы другим взаимодействовать с нашими сервисами, такими как сохранение определенных вещей в нашем db через api или получение определенной информации.Индивидуальные стандарты создания API. Правильно ли этот API?

В самом API-интерфейсе ожидаются данные JSON, которые могут быть перенесены через любой язык программирования в API. В отличие от других API, таких как facebook, мы не предоставляем пользователям никаких файлов для использования API, так как facebook предоставляет классы для разных языков для взаимодействия с их api. Поэтому мы думали, что пользователи api могут использовать любой язык для отправки нам json-данных и на основе этих json-данных, мы можем вызывать определенные функции api через параметр use, который они предоставляют через строку запроса.

Вот код API на самом базовом уровне, чтобы получить вам представление о том, как это работает:

class Api 
{ 
    /** 
    * Default function called when API url is accessed 
    * 
    * @return mixed 
    * @throws Exception 
    */ 
    public function index() 
    { 
     $appId = isset($_GET['appId']) ? $_GET['appId'] : null; 
     $apiKey = $_GET['apiKey'] ? $_GET['apiKey'] : null; 
     $method = $_GET['use'] ? $_GET['use'] : null; 

     $data = json_decode(file_get_contents("php://input"), true); 

     if ($this->validateRequest($appId, $apiKey, $method)) { 
      return call_user_func_array(array($this, $method), array($data)); 
     } 
    } 

    private function validateRequest($appId, $apiKey, $method) 
    { 
     # check referer 
     $requestUri = isset($_SERVER["HTTP_REFERER"]) ? $_SERVER["HTTP_REFERER"] : null; 

     if (!$requestUri) { 
      $this->bye('HTTP_REFERER is required!'); 
     } 

     # check if method exists 
     if (!$method || !method_exists('Apicall', $method)) { 
      $this->bye('Invalid \'use\' value!'); 
     } 

     # check appId, apiKey and requestUri 
     if (!$appId) { 
      $this->bye('Invalid appId!'); 
     } 

     if (!$apiKey) { 
      $this->bye('Invalid apiKey!'); 
     } 

     $db = new DB(); 
     $db->where('appid', $appId); 
     $db->where('apikey', $apiKey); 
     $db->where('request_uri', pathWithoutEndingSlash($requestUri)); 
     $db->get(); 

     if ($db->exists() && $db->result_count() > 0) { 
      return true; 
     } 

     $this->bye('Request Denied!'); 
    } 

    private function bye($error) 
    { 
     echo json_encode(array('Error' => $error)); 
     exit; 
    } 

    private function getIntervals() 
    { 
     $values = array('monthly', 'quarterly', 'yearly', 'single_payment'); 
     echo json_encode($values); 
    } 
} 

Как можно видеть, мы будем проверять, если это предусмотрено appId, apiKey и requestURI существует в нашей дб (которые мы уже генерироваться для пользователей API), а затем вызвать метод, указанный в переменной строки запроса use в вызове:

http://localhost/myapi/api.php?appId=local&apiKey=98a4d2e5b7fa21d424a0932c7f47a6943d57d64b&use=getIntervals

правильно ли это ж ay сделать частный API, или я все еще что-то не хватает?

ответ

1

Любой, кто прислушивается к запросам (так что, если вы вызываете свой api на WIFI или как AJAX-вызовы), вы сможете увидеть свои appId и apiKey. Таким образом, они смогут также назвать ваш api. Лучший способ заключается в следующем:

  • а) использовать SSL на сервере API для шифрования вызовов (POST'ing к SSL из не-SSL уже обеспечивает шифрование)
  • б) использовать POST или заголовки для отправки аутентификации данные вместо того, чтобы добавлять его в URL-адрес
  • c) один раз войти в систему клиента и предоставить токен для текущего сеанса, который разрешен для подключения в течение x минут или отбрасывается после x минут последнего вызова
  • d) заблокировать токен (от c) до IP-адреса клиента, если другой IP подключается к тому же токену, сделать недействительным токен

Если вы хотите быстрый REST API, я могу порекомендовать Restler. Он также включает аутентификацию. http://luracast.com/products/restler

+0

Спасибо полезным, что мне не хватало. благодаря – Dev01