【问题标题】:API REST post hash credentials and make GET, DELETE or PUT requestAPI REST 发布哈希凭据并发出 GET、DELETE 或 PUT 请求
【发布时间】:2015-10-28 11:21:30
【问题描述】:

我正在使用这个 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 请求时(我只是取消注释客户端中注释的行),它返回一个错误:

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

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

谢谢!

【问题讨论】:

  • 您是否使用 delete/put/get 方法声明了到控制器的路由?
  • @yergo 是的,实际上我解决了 PUT、DELETE 请求。我只是在 GET 请求方面遇到了问题。
  • 我会调查this line。也许你正在重置 $this->_maxRequestDelay 给你太少的时间来使用 API
  • @yergo 不工作...我只是遇到了 GET 请求的问题。 POST、PUT、DELETE……一切正常。似乎客户端链接](github.com/jeteokeeffe/php-hmac-rest-api/blob/master/…) 发送所有其他请求,但不发送 GET。主要开发人员说它对他有用,并且代码看起来很稳定而且没有错误。那里有什么问题? : ´ (
  • 原始客户端发送包括GET在内的所有请求。当您将客户端实现与 POST 以外的其他方法一起使用时,我会责怪 curlopt 设置中有太多或不正确的选项

标签: php api rest curl phalcon


【解决方案1】:

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

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 运行它时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 2017-05-05
    • 2012-02-16
    • 2015-07-10
    相关资源
    最近更新 更多