首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gimbal鉴权失败,401未授权(PHP cURL请求)

Gimbal鉴权失败,401未授权(PHP cURL请求)
EN

Stack Overflow用户
提问于 2015-08-30 04:13:37
回答 1查看 1.6K关注 0票数 0

我正在尝试连接Gimbal管理器Restful API。我的组织有一个帐户和一个API密钥。我的cURL请求总是失败,并收到来自API端点的401未授权响应。下面是我用PHP编写的cURL请求:

代码语言:javascript
复制
    // from Gimbal Manager:
    define('ORG_API_KEY', 'XXXXXXXXXXXXXXXXX') ;

    // new beacon registration object:
    $post = array (
        "factory_id" => "XXXX-XXXXX",
        "name" => "NewBeacon",
        "latitude" => 12345
        "longitude" => 67890,
        "visibility" => "public"
    );

    $url = "https://manager.gimbal.com/api/beacons";
    $headers = array(
          'AUTHORIZATION: Token token=' . ORG_API_KEY, 
          'Content-type: application/json'
    ) ;
    $debug = 1 ;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers, TRUE);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    if ($debug) {
        curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
        curl_setopt($ch, CURLOPT_HEADER, TRUE);
        curl_setopt($curl, CURLINFO_HEADER_OUT, true);
    }

    curl_setopt($crl, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($crl, CURLOPT_SSL_VERIFYPEER, false);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post);

    $result = curl_exec($ch);

(编辑)和这里的请求头(来自上面的$headerSent变量)

代码语言:javascript
复制
POST /api/beacons HTTP/1.1
Host: manager.gimbal.com
Accept: */*
Content-Length: 577
Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------ce1a4e9dd55e

这是来自Gimbal的回应:

代码语言:javascript
复制
HTTP/1.1 401 Unauthorized
Cache-Control: no-cache
Content-Type: text/html; charset=utf-8
Date: Sat, 29 Aug 2015 20:05:10 GMT
Server: Apache
Status: 401 Unauthorized
Vary: Accept-Encoding
WWW-Authenticate: Token realm="Application"
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-Request-Id: 7abe53cd-d161-4886-bb61-8cfedf71743a
X-XSS-Protection: 1; mode=block
Content-Length: 27
Connection: keep-alive
HTTP Token: Access denied.

我尝试了几种不同的方式来表达身份验证令牌:

代码语言:javascript
复制
AUTHORIZATION: <$token>
AUTHORIZATION: Token <$token>
AUTHORIZATION: Token token=<$token>

它们都给出了相同的401响应。我注意到这里和其他地方的其他标签描述了类似的问题,但没有一个被标记为已解决。

有没有人有幸接触到了?如果是这样,你的代码看起来是不是不一样了?

EN

回答 1

Stack Overflow用户

发布于 2015-08-30 04:47:24

最后,我在上面的初始代码中遇到了两个问题。

CURLOPT_HTTPHEADER上的TRUE标志阻止发送AUTH/Content-type报头(不确定我为什么把它放在那里,也不确定该标志是否有任何值或意义)。

我发送的帖子数据格式不正确。因为我请求的是内容类型的JSON,所以它期望POST数据采用该格式。一旦我添加了json_encode($post),一切就都正常了。

代码语言:javascript
复制
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers, TRUE);
.. .became ....
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

and

curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
... became ....
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post));

有时需要仔细地输入和格式化一个大的StackOverflow问题,才能看到代码中的缺陷并自己解决它。:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32290268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档