2012-04-14 3 views
14

Я реализую обертку R вокруг PiCloud's REST API с использованием пакета RCurl, чтобы сделать запросы HTTP (S) сервером API. API использует базовую HTTP-аутентификацию для проверки наличия у пользователей достаточных разрешений. Документация PiCloud приведен пример использования API и аутентификации с завитком:RCURL: HTTP-аутентификация, когда сайт отвечает протоколом HTTP 401 без WWW-аутентификации

$ curl -u 'key:secret_key' https://api.picloud.com/job/?jids=12 

Это прекрасно работает. Переводя это команда эквивалентного RCurl в:

getURL("https://api.picloud.com/job/?jids=12", userpwd="key:secret") 

Выполнения этой функции я получаю следующее сообщение об ошибке:

[1] "{\"error\": {\"msg\": \"No HTTP Authorization information present\", \"code\": 995, \"retry\": false}}" 

Исследуя вопрос более подробно, я обнаружил, что запросы HTTP, сделанный завиток команд включены поле авторизации в первой команде GET.

RCURL не делает этого. Вместо этого он сначала отправляет запрос GET без установленного поля авторизации. Если он получает код ошибки 401 И ответ с полем WWW-аутентификация, он отправляет другой запрос GET с полем авторизации.

Хотя спецификация HTTP требует сообщений, которые возвращаются с кодом ошибки 401, чтобы включить поле WWW-Authenticate, сообщения API PiCloud этого не делают. Таким образом, при вызове getURL даже с параметром userpwd RCURl никогда не отправит запрос GET с установленным полем авторизации. В результате аутентификация всегда будет терпеть неудачу.

Есть ли способ заставить RCURL установить поле авторизации в первом отправляемом GET сообщении? Если нет других пакетов R, которые я мог бы использовать в использовании?

ответ

23

Я решил проблему с помощью автора RCurl, Duncan Lang. Решение состоит в том, чтобы явно указать параметр httpauth, который сначала задает метод проверки подлинности. Эта работа:

getURL("https://api.picloud.com/job/?jids=12", userpwd="key:secret", httpauth = 1L) 

httpauth - это битмаска, определяющая, какие методы аутентификации использовать. Дополнительную информацию см. В разделе HTTP Authentication: the libcurl tutorial.

+1

Я пытался отслеживать это вниз в течение нескольких часов. Благодаря! –

+0

Если вы переходите в ручку curl, которую можно использовать повторно, вы должны установить 'httpauth = 1' в своем вызове' getCurlHandle() '. (Это был единственный способ получить 'postForm()' для работы с базовым auth: передача 'httpauth' в качестве параметра' postForm() 'не работала.) –

6

Эквивалентный код в HTTR является:

library(httr) 
GET("https://api.picloud.com/job/?jids=12", authenticate("key", "secret"))