5

我可以使用 curl 在命令行中轻松完成:

curl --digest -u "user:password" [url]

但我正在尝试使用 Ruby 的 Net::HTTP。尝试使用 Net::HTTP 获取 API 时,有没有办法可以提供我的用户名和密码?

我尝试了 basic_auth 方法,但它不起作用。

这是我的代码片段

基本认证

uri = URI("https://www.commcarehq.org/a/chanderi/api/v0.4/form/?xmlns=http://openrosa.org/formdesigner/C3B60561-F631-4D4C-8611-10E975EF8B44")

res = Net::HTTP.start(uri.hostname, uri.port) {|http|
  req = Net::HTTP::Get.new(uri)
  req.basic_auth 'myusername', 'mypassword'
  http.request(req)
}
puts res.body

对于 net::http::digestauth

digest_auth = Net::HTTP::DigestAuth.new

uri = URI.parse 'http://localhost:8000/'
uri.user = CGI.escape('username@mail.com')
uri.password = 'password'
h = Net::HTTP.new uri.host, uri.port
req = Net::HTTP::Get.new uri.request_uri
res = h.request req

Net::HTTPBadResponse:错误的状态行:“”

我正在关注http://docs.seattlerb.org/net-http-digest_auth/Net/HTTP/DigestAuth.html

4

5 回答 5

2

这就是我使用的:

#The URL
uri = URI.parse("http://lab")
http = Net::HTTP.new(uri.host, uri.port)
#Request URL
request = Net::HTTP::Get.new(uri.request_uri)
#Basic authentication
request.basic_auth("userid", "secret")
response = http.request(request)
于 2013-08-01T10:27:03.580 回答
1

basic_auth方法是提供用户名和密码的正确方法,但前提是服务器需要这种形式的身份验证。如果正如您的 curl 片段所暗示的那样,它需要摘要身份验证,那么基本身份验证确实不起作用。

Net::HTTP 不支持内置摘要身份验证,但是net-http-digest_auth增加了对它的支持。gem 包含一些示例用法

于 2013-07-28T15:37:21.427 回答
1

在我的 Ruby Net::HTTP 备忘单中有一个基本身份验证示例:https ://github.com/augustl/net-http-cheat-sheet/blob/master/basic_auth.rb

为了完整起见,在此处发布代码:

require "net/http"
require "uri"

uri = URI.parse("http://google.com/")

http = Net::HTTP.new(uri.host, uri.port)
request = Net::HTTP::Get.new(uri.request_uri)
request.basic_auth("username", "password")
response = http.request(request)

这对我有用。也许您正在与非标准服务器交谈?

于 2013-08-06T14:23:52.837 回答
0

这里是:Net::HTTP记录。

创建一个新的 Net::HTTP 对象而不打开 TCP 连接或 HTTP 会话。

地址应该是 DNS 主机名或 IP 地址,端口是服务器运行的端口。如果未指定端口,则使用 HTTP 或 HTTPS 的默认端口。

如果没有给出 p_ 参数,则代理主机和端口取自 http_proxy 环境变量(或其大写等效项)(如果存在)。如果代理需要身份验证,您必须手动提供。有关环境中代理检测的详细信息,请参阅 URI::Generic#find_proxy。要禁用代理检测,请将​​ p_addr 设置为 nil。

如果您要连接到自定义代理,p_addr 代理主机的 DNS 名称或 IP 地址,p_port 用于访问代理的端口,如果需要授权使用代理,则 p_user 和 p_pass 用户名和密码。

于 2013-07-28T14:59:21.140 回答
0

使用DigestAuth,你应该做的是写在http://docs.seattlerb.org/net-http-digest_auth/Net/HTTP/DigestAuth.html请求两次,因为第二个请求(200)使用第一个请求错误标头(401)。检查auth变量:

require 'uri'
require 'net/http'
require 'net/http/digest_auth'

digest_auth = Net::HTTP::DigestAuth.new

uri = URI.parse 'http://localhost:8000/'
uri.user = 'username'
uri.password = 'password'

h = Net::HTTP.new uri.host, uri.port

req = Net::HTTP::Get.new uri.request_uri

res = h.request req
# FIRST REQUEST: res is a 401 response with a WWW-Authenticate header

auth = digest_auth.auth_header uri, res['www-authenticate'], 'GET'

# create a new request with the Authorization header
req = Net::HTTP::Get.new uri.request_uri
req.add_field 'Authorization', auth

# SECOND REQUEST: re-issue request with Authorization
res = h.request req
于 2017-06-12T20:57:00.793 回答