2012-04-14 16 views
14

Estoy implementando un contenedor R alrededor de PiCloud's REST API usando el paquete RCurl para realizar solicitudes HTTP (S) al servidor API. La API usa la autenticación HTTP básica para verificar que los usuarios tengan permisos suficientes. La documentación PiCloud da un ejemplo del uso de la API y autenticar con curl:RCurl: Autenticación HTTP cuando el sitio responde con código HTTP 401 sin autenticación WWW

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

Esto funciona perfectamente. Traduciendo esto a la orden de un RCurl equivalente:

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

La ejecución de esta función recibo el siguiente mensaje de error:

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

Explorando el tema más a fondo me encontré con que las peticiones HTTP realizadas por el comando curl incluidos el campo Autorización en el primer comando GET.

RCurl no hace esto. En cambio, primero envía una solicitud GET sin el campo de autorización establecido. Si recibe un código de error 401 Y una respuesta con un campo WWW-Authenticate, envía otra solicitud GET con el campo Autorización.

Aunque la especificación HTTP requiere mensajes que devuelven un código de error 401 para incluir el campo WWW-Authenticate, los mensajes API de PiCloud no. Por lo tanto, al llamar al getURL, incluso con la opción userpwd, establecer RCurl nunca enviará una solicitud GET con el campo de autorización establecido. Como resultado, la autenticación siempre fallará.

¿Hay alguna manera de forzar a RCurl a establecer el campo Autorización en el primer mensaje GET que envía? Si no, ¿hay algún otro paquete R que pueda utilizar?

Respuesta

23

He resuelto el problema con la ayuda del autor de RCurl, Duncan Lang. La solución es establecer explícitamente la opción httpauth que establece el método de autenticación para probar inicialmente. Esto funciona:

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

httpauth es una máscara de bits que especifica qué métodos de autenticación para su uso. Consulte la sección Autenticación HTTP en the libcurl tutorial para obtener más detalles.

+1

que he estado tratando de realizar un seguimiento de esto abajo durante horas. ¡Gracias! –

+0

Si pasa un identificador de curl reutilizable, debe establecer 'httpauth = 1' en su llamada a' getCurlHandle() '. (Esta era la única forma en que podía hacer que 'postForm()' trabajara con auth básica: pasar 'httpauth' como parámetro a' postForm() 'no funcionaba). –

6

El código equivalente en HTTR es:

library(httr) 
GET("https://api.picloud.com/job/?jids=12", authenticate("key", "secret")) 
Cuestiones relacionadas