Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我需要一个API。我应该从哪里开始?_Php_Security_Api_Kohana 3_Signature - Fatal编程技术网

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

Php 我需要一个API。我应该从哪里开始?,php,security,api,kohana-3,signature,Php,Security,Api,Kohana 3,Signature,我正在从头开始构建一个PHP应用程序(使用Kohana3框架)。我将设计它,以便可以使用API在内部访问数据。同时,我希望最终将其提供给公众 我计划使用RESTful访问方法。然而,我很难找到关于如何正确保护API的清晰信息。换句话说,如何实现API签名和访问?您可以试试。它将使您能够快速构建RESTful API,然后将其用于您的应用程序,并在以后公开相同的API。我认为一个好的起点是阅读有关数字签名的一般信息。维基百科是一个很好的资源或工具。 基本上,我会给每个客户机一个私钥。在客户端库中,

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


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

您可以试试。它将使您能够快速构建RESTful API,然后将其用于您的应用程序,并在以后公开相同的API。

我认为一个好的起点是阅读有关数字签名的一般信息。维基百科是一个很好的资源或工具。

基本上,我会给每个客户机一个私钥。在客户端库中,我将加密密钥。当客户端发出请求时,请验证密钥是否是您发给该特定客户端的密钥。

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

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

然后,我们用返回的“json_encode”包装每个响应,并使用HTTPS连接进行安全保护

对于客户机类,我们将所有内容包装在调用中,比如$client->get_my_data($api_key),下面有一层使用PHPLibcurl,它可以很好地提供基本的身份验证

希望这有帮助

卷曲

    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;
        }
    }
私有函数curl\u get($url、$apikey、$co)
{
$curl\u handle=curl\u 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\u setopt($curl\u handle,CURLOPT\u DNS\u USE\u GLOBAL\u CACHE,FALSE);
$buffer=curl\u exec($curl\u handle);
$error=curl\u error($curl\u handle);
卷曲关闭($curl\u handle);
//检查成功或失败
if(空($buffer)){
//echo“出错:(错误:”.$error.
”; }否则{ 返回$buffer; } }
你的问题比这个大一点;但我可以提供一个关于REST的小观察

我在REST中发现,对于底层数据模型,最好使用人工键,而不是自然键


例如,考虑RESURLL URL:<代码>https://server/yourApp/viewUser/1234.html这将显示id为1234的用户。但是,如果您使用自然键,您可能会有类似以下内容的URL
https://server/yourApp/viewUser/Bob.html
或更糟的是,如果不是Bob,而是“Bob X”或“Bob?key=Value”。您不必考虑生成无效的URL。

OAuth将是一个不错的选择。单个键/值对也是如此。您可能还希望查看但不完全确定它是否适合您尝试执行的操作。

查看3scale()要做到这一点,它可以处理身份验证、访问控制、策略、速率限制等,并且对大量流量是免费的。我们有一个PHP模块可以插入到系统中以启用这些功能。(免责声明-我在那里工作-但希望它有用!)

Wow frapi看起来很不错,尽管他们的网站比你开始点击时看起来要简朴得多。谢谢,但这不是我想要的答案。我在寻找身份验证密钥……某种程度上。我也不理解frapi的这一部分(我不知道他们在哪里定义了什么“API密钥”)是的。我在主题和授权方面进行了访问控制。您可以使用HTTP BASIC/SSL或SSL mutual auth来建立主题ID,以及任何您想要的授权。是的。这就是我试图理解的。Oauth在如何在我自己的应用程序中实现为提供者的方法上很混乱。我宁愿自己做LF,学习,然后考虑使用他们的,不断变化的库。我在基础知识上遇到了麻烦。你解释了与我预想的类似的东西。虽然,会话和cookie也起到了保持签名的作用。使用委派的签到也是另一个问题。客户机类,你是指客户端的主界面吗?通过RESTful URL进行讨论?比如,client[controller],get_name[method],比如:site.com/api/client/123?apikey=12345,它激发$client->get_name('123',apikey)?这是对的,这样客户端就可以在php文件中包含类并访问它,我将使用CURL的示例“get”函数更新我的答案。