2015-08-29 4 views
0

Я пытаюсь подключиться к менеджеру Gimbal Restful API. У меня есть учетная запись и API-ключ для моей организации. Мой запрос cURL продолжает терпеть неудачу с несанкционированным ответом 401 от конечной точки API. Вот мой Curl запрос в PHP:Ошибка аутентификации Gimbal API с 401 неавторизованным (запрос PHP cURL)

// 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 вар выше)

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:

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. 

Я попробовал несколько различных способов выражения AUTH Токеном:

AUTHORIZATION: <$token> 
AUTHORIZATION: Token <$token> 
AUTHORIZATION: Token token=<$token> 

Все они дают одинаковый ответ 401. Я заметил, что другие билеты здесь и в других местах описывают аналогичную проблему, но ни один из них не был отмечен как разрешенный.

Неужели кому-нибудь удалось связаться с API-интерфейсом Gimbal Manager? Если это так, изменился ли ваш код?

+0

Только что обнаружил, что флаг TRUE в CURLOPT_HTTPHEADER предотвращает передачу переменных заголовка, что вызывает проблему аутентификации. Теперь я получаю статус: 400 Bad Request в моем ответе. Когда я получу это, я опубликую результаты –

ответ

0

В конце концов у меня было 2 проблемы с моим начальным кодом выше.

Флаг TRUE на CURLOPT_HTTPHEADER препятствует отправке заголовков AUTH/Content-type (не уверен, почему у меня там было это и не уверен, имеет ли этот флаг какое-либо значение или значение).

Данные POST, которые я отправлял, были не в правильном формате. Поскольку я запрашивал контент-тип JSON, он ожидал, что данные POST будут в этом формате. Когда я добавил json_encode ($ post), все сработало нормально.

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, чтобы увидеть недостаток в коде и решить ее самостоятельно. :)