尝试使用 HTTParty 或 Net:HTTP(或等)连接到“摘要式身份验证”网络服务

Posted

技术标签:

【中文标题】尝试使用 HTTParty 或 Net:HTTP(或等)连接到“摘要式身份验证”网络服务【英文标题】:Trying to connect to a "digest authentication" webservice using HTTParty or Net:HTTP (or etc) 【发布时间】:2010-01-09 02:47:33 【问题描述】:

我一直在尝试连接到使用摘要式身份验证的 Web 服务。

我可以在 Safari 中使用 user:password@service.site.com/endpoint 进行连接

我曾尝试在 Ruby 和 Rails 中使用 HTTParty 和 Net:HTTP 使用“基本”身份验证选项进行连接,但没有任何运气。

想知道 HTTParty/Net:HTTP“basic_auth”选项是否与“digest auth”服务不兼容?

如果没有,我可以通过其他方式连接吗?

【问题讨论】:

代码示例很有帮助。 我直接从HTTParty的例子rdoc.info/projects/jnunemaker/httparty 工作:wget 'user:password@service.vinlink.com/report?vin=vin&type=basic' 不起作用:httparty -u user:password 'service.vinlink.com/report?vin=vin&type=basic' 【参考方案1】:

HTTParty 基本身份验证显然与 digest_auth 不兼容。我找到了这个 Net:HTTP 扩展:https://codesnippets.joyent.com/posts/show/1075,并在 Crack gem http://github.com/jnunemaker/crack 的帮助下编写了一种方法来处理这个问题:

 def self.decode vin
    url = URI.parse(APP_CONFIG[:vinlink_url])
    Net::HTTP.start(url.host) do |http|
      res = http.head(url.request_uri)
      req = Net::HTTP::Get.new("/report?type=basic&vin=#vin")
      req.digest_auth(APP_CONFIG[:vinlink_login], APP_CONFIG[:vinlink_password], res)
      @response = http.request(req)
    end
    if @response.code == "200"
      hash = Crack::XML.parse(@response.body).recursive_downcase_keys!.recursive_symbolize_keys!
    end
  end  

【讨论】:

【参考方案2】:

今天无法访问上面给出的 coden-ps 链接,但代码也可以在此处https://gist.github.com/73102 获得。我已经成功地将它用于摘要身份验证,但遇到了多个请求的问题,出现“过时的客户端随机数”错误 - 通过每次调用 digest_auth 函数时生成一个新的随机数来解决。当我看的时候没有找到太多,所以希望这对某人有帮助。

【讨论】:

以上是关于尝试使用 HTTParty 或 Net:HTTP(或等)连接到“摘要式身份验证”网络服务的主要内容,如果未能解决你的问题,请参考以下文章

将 curl 命令转换为 httparty

HTTParty无法发送长JSON [重复]

如何关闭 HTTParty 帖子正文中的 URI 编码?

Ruby HTTParty - 获取重定向的 URL

Twitter 搜索 API:通过 HTTParty “未经授权”,但通过 Curl 成功

Ruby——httparty使用代理