API REST post 散列凭据并发出 GET、DELETE 或 PUT 请求

API REST post hash credentials and make GET, DELETE or PUT request

我正在使用这个 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);

当我发出 post 请求时,一切正常,但是当我尝试发出 GET、PUT 或 DELETE 请求时(我只是取消注释客户端中注释的行),它 returns我有一个错误:

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

我认为我可能遗漏了一些东西(与身份验证相关的东西)。有什么解决办法吗?

谢谢!

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

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.