Как выполнить базовую аутентификацию через HTTP в Ruby?

После многого, я нашел некоторые решения, которые кажутся рабочими, но не для меня...

Например, у меня есть этот скрипт:

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
}

Когда я запускаю его, он дает мне страницу, запрашивающую аутентификацию, но если я напишу следующий URL-адрес в браузере, я попаду на сайт без проблем:

https://my_user:[email protected]/gb/PastSetupsXLS.asp?SR=31,6

Я также пытался с открытым 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")

Но результат тот же, сайт запрашивает аутентификацию пользователя. Какие-нибудь советы о том, что я делаю неправильно? Должен ли я кодировать пароль в Base 64?

Ответ 1

Я написал фрагмент кода, основанный на примерах, приведенных в документах 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

И мой .htaccess файл выглядит так:

AuthName "Authorization required"
AuthUserFile c:/wamp/www/ssl/.htpasswd
AuthType basic
Require valid-user

Мой .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 следует использовать при производстве, которое по умолчанию является стандартным, поэтому вы можете полностью его пропустить.