【问题标题】:RCurl: HTTP Authentication When Site Responds With HTTP 401 Code Without WWW-AuthenticateRCurl:当站点使用没有 WWW-Authenticate 的 HTTP 401 代码响应时的 HTTP 身份验证
【发布时间】:2012-04-14 22:45:14
【问题描述】:

我正在使用RCurl 包围绕PiCloud's REST API 实现一个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 消息不这样做。因此,当调用getURL 时,即使设置了 userpwd 选项,RCurl 也永远不会发送设置了授权字段的 GET 请求。因此,身份验证总是会失败。

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

【问题讨论】:

    标签: r rcurl


    【解决方案1】:

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

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

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

    【讨论】:

    • 我已经尝试了几个小时来追踪这个问题。谢谢!
    • 如果传入一个可重复使用的 curl 句柄,你必须在调用 getCurlHandle() 时设置 httpauth=1。 (这是我可以让postForm() 使用基本身份验证的唯一方法:将httpauth 作为参数传递给postForm() 不起作用。)
    【解决方案2】:

    httr 中的等效代码为:

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

    【讨论】:

      猜你喜欢
      • 2015-08-12
      • 2014-10-05
      • 2018-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-15
      • 1970-01-01
      • 2012-06-02
      相关资源
      最近更新 更多