Sto implementando un wrapper R attorno al PiCloud's REST API utilizzando il pacchetto RCurl per effettuare richieste HTTP (S) al server API. L'API utilizza l'autenticazione HTTP di base per verificare che gli utenti dispongano di autorizzazioni sufficienti. La documentazione PiCloud fornisce un esempio di utilizzando l'API e l'autenticazione con l'arricciatura:RCurl: autenticazione HTTP quando il sito risponde con il codice HTTP 401 senza autenticazione WWW
$ curl -u 'key:secret_key' https://api.picloud.com/job/?jids=12
Questo funziona perfettamente. Traducendo questo al comando di un RCurl equivalente:
getURL("https://api.picloud.com/job/?jids=12", userpwd="key:secret")
eseguito questa funzione viene visualizzato il seguente messaggio di errore:
[1] "{\"error\": {\"msg\": \"No HTTP Authorization information present\", \"code\": 995, \"retry\": false}}"
Esplorando la questione in modo più approfondito Ho trovato che le richieste HTTP fatte dal comando ricciolo inclusi il campo Autorizzazione nel primo comando GET.
RCurl non lo fa. Invece invia prima una richiesta GET senza il campo di autorizzazione impostato. Se riceve un codice di errore 401 E una risposta con un campo Autenticazione WWW invia un'altra richiesta GET con il campo Autorizzazione.
Sebbene la specifica HTTP richieda messaggi che restituiscano un codice di errore 401 per includere il campo WWW-Authenticate, i messaggi dell'API PiCloud no. Pertanto, quando si chiama getURL
anche con l'opzione userpwd, RCurl non invierà mai una richiesta GET con il campo di autorizzazione impostato. Di conseguenza l'autenticazione fallirà sempre.
Esiste un modo per forzare RCurl a impostare il campo Autorizzazione nel primo messaggio GET che invia? Se no ci sono altri pacchetti R che potrei esaminare usando?
Ho cercato di seguire questo giù per ore. Grazie! –
Se si passa a un handle di ricciolo riutilizzabile, è necessario impostare 'httpauth = 1' nella chiamata a' getCurlHandle() '. (Questo era l'unico modo in cui potevo ottenere 'postForm()' per lavorare con l'auth di base: passare 'httpauth' come parametro a' postForm() 'non funzionava.) –