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?
Próbowałem śledzić to w dół przez kilka godzin. Dzięki! –
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.) –