我需要一个API。我应该从哪里开始?

时间:2011-02-18 15:59:43

标签: php security api kohana-3 signature

我正在从头开始构建一个PHP应用程序(使用Kohana3框架)。我将构建它,以便我可以使用API​​在内部访问数据。与此同时,我想最终向公众提供。

我计划使用RESTful访问方法。但是,我很难找到有关如何正确保护API的明确信息。换句话说,我如何实现API签名和访问?

6 个答案:

答案 0 :(得分:5)

您可以尝试frapi。它将很快允许您构建RESTful API,然后可以将其用于您的应用程序,并在以后公开显示相同的API。

答案 1 :(得分:2)

OAuth将是一个不错的选择。一个键/值对也是如此。您可能还想查看Mashape,但不完全确定它符合您的要求。

答案 2 :(得分:1)

我认为一个好的起点是阅读有关数字签名的一般信息。维基百科是一个很好的资源http://en.wikipedia.org/wiki/Public_Key_Infrastructurehttp://en.wikipedia.org/wiki/X.509 在基本层面上,我会给每个客户一个私钥。在客户端库中,我会加密密钥。当客户端发出请求时,请验证密钥是您向该特定客户端发出的密钥。

答案 3 :(得分:1)

请查看3scale(http://www.3scale.net/)来执行此操作 - 它处理身份验证,访问控制,策略,速率限制等,并且对于大量流量是免费的。我们有一个PHP模块可以插入系统来启用这些功能。 (免责声明 - 我在那里工作 - 但希望它有用!)

答案 4 :(得分:0)

我使用带有基本身份验证的CodeIgniter创建了一个PHP REST API(提供“公司ID”和“API密钥”作为用户名/密码)。后来我们发现有必要配置与API密钥直接相关的会话密钥,只有到期时间。

基本上,我们在数据存储区(nosql品种:)中查询了不同类型的数据,具体取决于URL中提供的“方法”。我们使用CodeIgniter提供的“segment”功能来访问它。

然后我们用返回的“json_encode”包装每个响应,我们还使用HTTPS连接来保证安全。

对于客户端类,我们将所有内容都包含在$ client-> get_my_data($ api_key)之类的调用中,并使用PHP Libcurl在下面创建一个层,它可以很好地提供基本身份验证。

希望这有帮助,

CURL_GET

    private function curl_get($url, $apikey, $co)
    {
        $curl_handle = curl_init();
        curl_setopt($curl_handle, CURLOPT_URL, $url);
        curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2);
        curl_setopt($curl_handle, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl_handle, CURLOPT_USERPWD, $co.":".$apikey);
        curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl_handle, CURLOPT_DNS_USE_GLOBAL_CACHE, FALSE);

        $buffer = curl_exec($curl_handle);
        $error = curl_error($curl_handle);
        curl_close($curl_handle);
        // check for success or failure
        if (empty($buffer)) {
        //echo 'Something went wrong :( error: '.$error.'<Br>';
        } else {
        return $buffer;
        }
    }

答案 5 :(得分:0)

你的问题比这个要大一些;但我可以提供一个关于REST的小观察。

我发现使用REST,就是最好使用人工密钥作为底层数据模型,而不是自然键。

例如,考虑一下RESTfull网址:https://server/yourApp/viewUser/1234.html这会向用户显示ID为1234.但是,如果您使用自然键,则可能会有类似此https://server/yourApp/viewUser/Bob.html的网址,或者更糟糕的是,如果不是Bob它的“Bob X”或“Bob?key = Value”。您不必考虑生成无效的网址。