如何在Ruby中通过HTTP进行基本身份验证?

Edu*_*eda 18 ruby https basic-authentication

看了很多之后,我发现了一些似乎有效的解决方案,但对我来说并不适用......

例如,我有这个脚本:

require 'net/http'
require "net/https"

@http=Net::HTTP.new('www.xxxxxxx.net', 443)
@http.use_ssl = true
@http.verify_mode = OpenSSL::SSL::VERIFY_NONE
@http.start() {|http|
    req = Net::HTTP::Get.new('/gb/PastSetupsXLS.asp?SR=31,6')
    req.basic_auth 'my_user', 'my_password'
    response = http.request(req)
    print response.body
}
Run Code Online (Sandbox Code Playgroud)

当我运行它时,它会给我一个请求身份验证的页面,但是如果我在浏览器中编写以下URL,我会毫无问题地进入网站:

https://my_user:my_password@www.xxxxxxx.net/gb/PastSetupsXLS.asp?SR=31,6
Run Code Online (Sandbox Code Playgroud)

我也试过open-uri:

module OpenSSL
    module SSL
        remove_const :VERIFY_PEER
    end
end
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE

def download(full_url, to_here)
    writeOut = open(to_here, "wb") 
    writeOut.write(open(full_url, :http_basic_authentication=>["my_user", "my_password"]).read) 
    writeOut.close 
end

download('https://www.xxxxxxx.net/gb/PastSetupsXLS.asp?SR=31,6', "target_file.html")
Run Code Online (Sandbox Code Playgroud)

但结果是一样的,该网站要求用户身份验证.我做错了什么提示?我必须在Base 64中编码密码吗?

Mat*_*att 40

我根据Net :: HTTP文档中给出的示例编写了一段代码,并在我的本地WAMP服务器上进行了测试 - 它运行正常.这就是我所拥有的:

require 'net/http'
require 'openssl'

uri = URI('https://localhost/')

Net::HTTP.start(uri.host, uri.port,
  :use_ssl => uri.scheme == 'https', 
  :verify_mode => OpenSSL::SSL::VERIFY_NONE) do |http|

  request = Net::HTTP::Get.new uri.request_uri
  request.basic_auth 'matt', 'secret'

  response = http.request request # Net::HTTPResponse object

  puts response
  puts response.body
end
Run Code Online (Sandbox Code Playgroud)

我的.htaccess文件看起来像这样:

AuthName "Authorization required"
AuthUserFile c:/wamp/www/ssl/.htpasswd
AuthType basic
Require valid-user
Run Code Online (Sandbox Code Playgroud)

.htpasswd只是用htpasswd -c .htpasswd matt密码"秘密" 生成的一个班轮.当我运行我的代码时,我得到"200 OK"和index.html的内容.如果我删除该request.basic_auth行,我会收到401错误.

更新:

正如@stereoscott在评论中所指出的那样,:verify_mode我在示例(OpenSSL::SSL::VERIFY_NONE)中使用的值对于生产来说是不安全的.

OpenSSL :: SSL :: SSLContext文档中列出的所有可用选项均为:VERIFY_NONE,VERIFY_PEER,VERIFY_CLIENT_ONCE,VERIFY_FAIL_IF_NO_PEER_CERT,其中(根据OpenSSL文档)仅在客户端模式中使用前两个选项.

所以VERIFY_PEER应该用于生产,这是默认的 btw,所以你可以完全跳过它.

  • 要求应该是'net/https'而不是'net/http'(至少那是我必须改变以使其适用于我) (5认同)

Dav*_*ers 7

以下是最终为我工作的内容:

require "uri"
require "net/http"

url = URI("https://localhost/")

https = Net::HTTP.new(url.host, url.port)
https.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Authorization"] =  "Basic " + Base64::encode64("my_user:my_password")

response = https.request(request)
puts response.read_body
Run Code Online (Sandbox Code Playgroud)

我通过在Postman中构建一个新的 HTTP 请求、指定 URL、选择“基本身份验证”授权类型并输入凭据来想出这一点。

单击“代码”图标 ( </>) 并选择“Ruby - Net::HTTP”将生成一个代码片段,为您提供上面的输出。

邮递员负责对凭据进行编码,但这个答案帮助我动态设置这些值。您还可以省略“cookie”键作为请求的一部分。