RCurl:站点响应HTTP 401代码而不使用WWW-Authenticate时的HTTP身份验证

时间:2012-04-14 22:45:15

标签: r rcurl

我正在使用PiCloud's REST API包在RCurl周围实现一个R包装器,以向API服务器发出HTTP(S)请求。 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}}"

更深入地探讨这个问题我发现curl命令发出的HTTP请求包含了第一个GET命令中的Authorization字段。

RCurl不会这样做。相反,它首先发送没有设置授权字段的GET请求。如果它收到401错误代码和带有WWW-Authenticate字段的响应,它将发送另一个带有Authorization字段的GET请求。

虽然HTTP规范要求使用401错误代码返回的消息包含WWW-Authenticate字段,但PiCloud API消息却不包含。因此,即使使用userpwd选项设置调用getURL,RCurl也不会发送具有授权字段集的GET请求。因此,身份验证将始终失败。

有没有办法强制RCurl在它发送的第一个GET消息中设置授权字段?如果没有,我可以使用其他任何R包?

2 个答案:

答案 0 :(得分:24)

我在RCurl的作者Duncan Lang的帮助下解决了这个问题。解决方案是显式设置httpauth选项,该选项将身份验证方法设置为最初尝试。这有效:

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

httpauth是一个位掩码,用于指定要使用的身份验证方法。有关详细信息,请参阅the libcurl tutorial的HTTP身份验证部分。

答案 1 :(得分:7)

httr中的等效代码是:

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