我正在使用这个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
我认为它缺乏某些东西(与认证相关的东西)。任何解决方案?
谢谢!
答案 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运行它。