私有API创建标准 - 此API是否正确?

时间:2013-12-05 10:56:20

标签: php api standards web-standards

因此,我们想要创建一个私有API,允许其他人与我们的服务进行交互,例如通过api保存数据库中的某些内容或获取某些信息。

API本身只期望可以通过任何编程语言向API提供的JSON数据。与facebook等其他API不同,我们不会向用户提供任何文件,因为facebook会提供不同语言的类来与他们的api进行交互。所以我们认为api用户可以使用任何语言向我们发送json数据,并根据json数据,我们可以通过查询字符串提供的use参数调用api的某些函数。

以下是最基本级别的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);
    }
}

可以看出,我们验证提供的appIdapiKeyrequestURI是否存在于我们的数据库(我们已经为api用户生成)中,然后调用通过{指定的方法{1}}调用中的查询字符串变量:

use

这是制作私有API的正确方法还是我还缺少什么?

1 个答案:

答案 0 :(得分:1)

任何听取请求的人(如果您通过WIFI或AJAX呼叫呼叫您的api)将能够看到您的appId和apiKey。所以他们也可以打电话给你的api。更好的方法是:

  • a)在您的API服务器上使用SSL来加密呼叫(从非SSL发送到SSL已经确保加密)
  • b)使用POST或标头发送您的身份验证数据,而不是将其添加到网址
  • c)让客户端登录一次并为当前会话提供一个令牌,允许在x分钟内连接或在最后一次呼叫的x分钟后丢弃
  • d)将令牌(从c)锁定到客户端IP,如果另一个IP使用相同的令牌连接,则使令牌无效

如果你想要一个快速的REST API我可以推荐Restler。它还包含身份验证。 http://luracast.com/products/restler