web-dev-qa-db-fra.com

Comment faire une authentification de base sur HTTPs dans Ruby?

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?

18

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.

40
Matt