Après avoir beaucoup cherché, j'ai trouvé des solutions qui semblent fonctionner, mais pas pour moi ...
Par exemple, j'ai ce script:
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
}
Lorsque je l'exécute, il me donne une page qui demande une authentification, mais si j'écris l'URL suivante dans le navigateur, j'entre sur le site sans problème:
https://my_user:[email protected]/gb/PastSetupsXLS.asp?SR=31,6
J'ai également essayé avec 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")
Mais le résultat est le même, le site demande l'authentification des utilisateurs. Des conseils sur ce que je fais mal?. Dois-je encoder le mot de passe en Base 64?
J'ai écrit un morceau de code basé sur des exemples donnés dans les Net :: HTTP docs et l'ai testé sur mon serveur WAMP local - cela fonctionne très bien. Voici ce que j'ai:
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
Et mon .htaccess
le fichier ressemble à ceci:
AuthName "Authorization required"
AuthUserFile c:/wamp/www/ssl/.htpasswd
AuthType basic
Require valid-user
Ma .htpasswd
est juste un liner généré avec htpasswd -c .htpasswd matt
pour le mot de passe "secret". Lorsque j'exécute mon code, j'obtiens "200 OK" et le contenu de index.html. Si je supprime le request.basic_auth
ligne, j'obtiens une erreur 401.
MISE À JOUR:
Comme indiqué par @stereoscott dans les commentaires, le :verify_mode
valeur que j'ai utilisée dans l'exemple (OpenSSL::SSL::VERIFY_NONE
) n'est pas sûr pour la production.
Toutes les options disponibles répertoriées dans les documents OpenSSL :: SSL :: SSLContext sont: VERIFY_NONE, VERIFY_PEER, VERIFY_CLIENT_ONCE, VERIFY_FAIL_IF_NO_PEER_CERT, parmi lesquelles (selon les documents OpenSSL ) uniquement le les deux premiers sont utilisés en mode client.
Alors VERIFY_PEER
devrait être utilisé sur la production, ce qui est la valeur par défaut btw, vous pouvez donc l'ignorer complètement.