2012-04-14 10 views
14

Wprowadzam opakowanie R około PiCloud's REST API przy użyciu pakietu RCurl, aby wysłać żądania HTTP (S) do serwera API. Interfejs API używa podstawowego uwierzytelniania HTTP w celu sprawdzenia, czy użytkownicy mają wystarczające uprawnienia. Dokumentacja PiCloud podaje przykład użycia api i uwierzytelniania z lokami:RCurl: Uwierzytelnianie HTTP, gdy witryna odpowiada za pomocą kodu HTTP 401 bez uwierzytelniania WWW.

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

Działa to idealnie. Przekładając to na komendzie równoważnej RCurl za:

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

Wykonywanie tej funkcji pojawia się następujący komunikat o błędzie:

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

Exploring kwestię głębiej stwierdziliśmy, że żądania HTTP wykonane przez polecenie zwinięcie włączone pole Autoryzacja w pierwszym poleceniu GET.

RCurl tego nie robi. Zamiast tego najpierw wysyła żądanie GET bez ustawionego pola autoryzacji. Jeśli otrzyma kod błędu 401 ORAZ odpowiedź w polu Uwierzytelnianie WWW, wysyła kolejne żądanie GET z polem Autoryzacja.

Chociaż specyfikacja HTTP wymaga wiadomości, które zwracają kod błędu 401, aby uwzględnić pole uwierzytelniania WWW, komunikaty API PiCloud nie. Tak więc przy wywołaniu getURL nawet przy ustawieniu opcji userpwd RCurl nigdy nie wyśle ​​żądania GET z ustawionym polem autoryzacji. W rezultacie uwierzytelnianie zawsze kończy się niepowodzeniem.

Czy istnieje sposób zmuszenia RCurl do ustawienia pola Authorization w pierwszej wysyłanej wiadomości GET? Jeśli nie są jakieś inne pakiety R, które mógłbym zaglądać używając?

Odpowiedz

23

Rozwiązałem problem z pomocą autora RCurla, Duncana Langa. Rozwiązaniem jest jawne ustawienie opcji httpauth, która ustawia początkowo metodę uwierzytelniania. Działa to:

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

httpauth to maska ​​bitowa określająca metody uwierzytelniania. Aby uzyskać więcej informacji, zobacz sekcję Uwierzytelnianie HTTP pod numerem the libcurl tutorial.

+1

Próbowałem śledzić to w dół przez kilka godzin. Dzięki! –

+0

Jeśli przekazujesz uchwyt wielokrotnego użytku, musisz ustawić 'httpauth = 1' w swoim wywołaniu na' getCurlHandle() '. (To był jedyny sposób, w jaki mogłem uzyskać 'postForm()' do pracy z podstawowym uwierzytelnieniem: przekazanie 'httpauth' jako parametru do' postForm() 'nie działało.) –

6

Odpowiednik kodu w httr jest:

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