RCURL: HTTP-аутентификация, когда сайт реагирует на HTTP-код 401 без WWW-аутентификации
Я реализую обертку R вокруг PICloud REST API с помощью пакета RCurl, чтобы сделать HTTP (S) запрашивает сервер API. API использует базовую HTTP-аутентификацию для проверки наличия у пользователей достаточных разрешений. Документация PiCloud дает пример использования api и проверки подлинности с помощью curl:
$ 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-запросы, сделанные командой curl, включали поле авторизации в первой команде GET.
RCurl этого не делает. Вместо этого он сначала отправляет запрос GET без установленного поля авторизации. Если он получает код ошибки 401 И ответ с полем WWW-аутентификация, он отправляет другой запрос GET с полем авторизации.
Хотя спецификация HTTP требует сообщений, которые возвращаются с кодом ошибки 401, чтобы включить поле WWW-Authenticate, сообщения API PiCloud этого не делают. Таким образом, при вызове getURL
даже с параметром userpwd RCURl никогда не будет отправлять запрос GET с заданным полем авторизации. В результате аутентификация всегда будет терпеть неудачу.
Есть ли способ заставить RCURL установить поле авторизации в первом отправляемом GET сообщении? Если нет других пакетов R, которые я мог бы использовать в использовании?
Ответы
Ответ 1
Я решил проблему с помощью автора RCurl, Duncan Lang. Решение состоит в том, чтобы явно указать параметр httpauth, который сначала задает метод проверки подлинности. Это работает:
getURL("https://api.picloud.com/job/?jids=12", userpwd="key:secret", httpauth = 1L)
httpauth - это битмаска, определяющая, какие методы аутентификации использовать. Подробнее см. В разделе HTTP Authentication из учебника libcurl.
Ответ 2
Эквивалентный код в httr:
library(httr)
GET("https://api.picloud.com/job/?jids=12", authenticate("key", "secret"))