2012-12-11 10 views
13

Dopo aver guardato un sacco, ho trovato alcune soluzioni che sembrano lavorare, ma non per me ...Come eseguire l'autenticazione di base su HTTP in Ruby?

Per esempio, io ho questo 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 
} 

quando l'eseguo, dà mi ha una pagina che le richieste per l'autenticazione, ma se scrivo il seguente URL nel browser, ricevo nel sito web senza problemi:

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

ho anche provato con 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") 

Ma il risultato è lo stesso, il sito richiede l'autenticazione dell'utente. Qualche consiglio su cosa sto sbagliando? Devo codificare la password in Base 64?

+0

Hai provato ad aggiungere il nome utente e la password nell'URL, nello stesso modo in cui lo inseriresti nel browser? –

+0

Sì, certo, ma in questo modo non è supportato per quelle librerie. –

risposta

33

Ho scritto un pezzo di codice basato su esempi forniti nel Net::HTTP docs e testato sul mio server WAMP locale - funziona perfettamente. Ecco quello che ho:

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 

E il mio file .htaccess simile a questo:

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

mio .htpasswd è solo un uno di linea generato con htpasswd -c .htpasswd matt la password "segreto". Quando eseguo il mio codice ottengo "200 OK" e il contenuto di index.html. Se rimuovo la riga request.basic_auth, ottengo l'errore 401.

UPDATE:

Come indicato dalla @stereoscott nei commenti, il valore :verify_mode ho utilizzato nell'esempio (OpenSSL::SSL::VERIFY_NONE) non è sicuro per la produzione.

Tutte le opzioni disponibili elencate nelle OpenSSL::SSL::SSLContext documentazione sono: VERIFY_NONE, VERIFY_PEER, VERIFY_CLIENT_ONCE, VERIFY_FAIL_IF_NO_PEER_CERT, di cui (secondo la OpenSSL docs) solo le prime due più sono utilizzati in modalità client.

Quindi VERIFY_PEER deve essere utilizzato sulla produzione, che è is the default btw, quindi è possibile saltare interamente.

+3

Il fabbisogno dovrebbe essere 'net/https' invece di 'net/http' (almeno questo è quello che dovevo cambiare per farlo funzionare per me) – Gu1234

+0

Questo davvero aiutato grazie. – Abram

+0

VERIFY_NONE non è il migliore in termini di sicurezza. Sebbene i dati siano crittografati su SSL, non puoi confermare che stai parlando al server che pensi di essere. – stereoscott

Problemi correlati