API REST后发布哈希凭证并发出GET,DELETE或PUT请求

时间:2015-10-28 11:21:30

标签: php api rest curl phalcon

我正在使用这个Phalcon PHP API HMAC框架,我有一个小问题。

我在routes.php中声明了一条GET路由,我试图从client-connect.php发出请求(一个简单的CURL脚本来发出请求)。

客户端的样子:

$privateKey = '593fe6ed77014f9502761028801aa376f141916bd26b1b3f0271b5ec3135b989';

$time = time();
$id = 1;

$data = [
    'name' => 'bob',
];


$message = buildMessage($time, $id, $data);

$hash = hash_hmac('sha256', $message, $privateKey);
$headers = ['API_ID: ' . $id, 'API_TIME: ' . $time, 'API_HASH: ' . $hash];


$ch = curl_init();

curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
curl_setopt($ch, CURLOPT_URL, $host);
// curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
curl_setopt($ch, CURLOPT_POST, FALSE);
curl_setopt($ch, CURLOPT_HEADER, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLINFO_HEADER_OUT, TRUE);

当我发布帖子请求时,一切正常,但是当我尝试发出GET,PUT或DELETE请求时(我只是取消注释客户端中注释的行),它会返回一个错误:

Request: 
DELETE /nodes/mikrotik HTTP/1.1
Host: vpn.wibee.com
Accept: */*
API_ID: 1
API_TIME: 1446031137
API_HASH: 4d0852239859da5e90270b3f7dfd2167f6e5153ca83a9c5896ee262e41b19674
Content-Length: 508
Expect: 100-continue
Content-Type: multipart/form-data; boundary=------------------------e71b5fd144802749


Response:
HTTP/1.1 100 Continue

HTTP/1.1 401 Unauthorized
Server: nginx/1.6.2
Date: Wed, 28 Oct 2015 11:18:58 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive

Access denied

我认为它缺乏某些东西(与认证相关的东西)。任何解决方案?

谢谢!

1 个答案:

答案 0 :(得分:2)

我会尝试一下。在客户端应用程序的原始实现中,您有这样的一部分:

curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
curl_setopt($ch, CURLOPT_URL, $host);
switch($method) {
    case 'POST':
        curl_setopt($ch, CURLOPT_POST, TRUE);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        break;
    case 'GET':
        break;
    default:
        $data = http_build_query($data);
        curl_setopt($ch, CURLOPT_POST, TRUE);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
        break;
}

你的实施完全不同。一旦使用POST方法,即使使用($ch, CURLOPT_POST, FALSE),功能也会令人惊讶地工作。但是一旦使用了所有其他请求,您就会遇到麻烦。这是因为你的GET实现做了一些不应该做的事情:

curl_setopt($ch, CURLOPT_POST, FALSE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

这对于使用CURL进行GET请求是不正确的。它令人惊讶地工作,但您正在接收拒绝访问。这可能是因为身份验证数据在服务器端没有正确解释。

其他方法也会有一些麻烦,因为你正在处理这部分原始代码:

$data = http_build_query($data);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

我最好的解决方案是建议你,尝试使用现有的代码示例,而不是手动重写它。扩展该代码供您使用不应该很复杂,特别是如果您从shell运行它。