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"))