尝试使用 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(或等)连接到“摘要式身份验证”网络服务的主要内容,如果未能解决你的问题,请参考以下文章