2012-12-11 10 views
13

Po obejrzeniu dużo, znalazłem kilka rozwiązań, które wydają się działać, ale nie dla mnie ...Jak wykonać podstawowe uwierzytelnianie przez HTTPs w Ruby?

Na przykład mam ten skrypt:

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 
} 

Kiedy go uruchomić, to daje mnie strona, która wnosi do uwierzytelniania, ale jeśli piszę następujący adres URL w przeglądarce, otrzymuję na stronie bez problemów:

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

próbowałem również z 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") 

Jednak wynik jest taki sam, witryna żąda uwierzytelnienia użytkownika. Jakieś wskazówki, co robię źle ?. Czy muszę zakodować hasło w Base 64?

+0

Czy próbowałeś dodać nazwę użytkownika i hasło w adresie URL w taki sam sposób, jak w przeglądarce? –

+0

Tak, oczywiście, ale w ten sposób nie jest obsługiwane dla tych bibliotek. –

Odpowiedz

33

Napisałem fragment kodu na podstawie przykładów podanych w Net::HTTP docs i przetestowałem go na moim lokalnym serwerze WAMP - działa dobrze. Oto co mam:

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 

A mój plik .htaccess wygląda następująco:

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

My .htpasswd jest tylko jedna wkładka generowane z htpasswd -c .htpasswd matt na hasło "tajne". Po uruchomieniu kodu uzyskuję "200 OK" i zawartość pliku index.html. Jeśli usuniemy linię request.basic_auth, otrzymam błąd 401.

UPDATE:

Jak wskazano @stereoscott w komentarzach, wartość :verify_mode użyłem w przykładzie (OpenSSL::SSL::VERIFY_NONE) nie jest bezpieczna dla produkcji.

Wszystkie dostępne opcje wymienione w OpenSSL::SSL::SSLContext docs są: VERIFY_NONE, VERIFY_PEER, VERIFY_CLIENT_ONCE, VERIFY_FAIL_IF_NO_PEER_CERT, z których (zgodnie z OpenSSL docs) tylko dwa pierwsze z nich są wykorzystywane w trybie klienta.

Do produkcji należy użyć VERIFY_PEER, którą is the default btw, można całkowicie pominąć.

+3

Wymaganie powinno być "net/https" zamiast "net/http" (przynajmniej to musiałem zmienić, aby działało dla mnie) – Gu1234

+0

To naprawdę pomogło dzięki. – Abram

+0

VERIFY_NONE nie jest najlepszy pod względem bezpieczeństwa. Chociaż dane są szyfrowane przez SSL, nie można potwierdzić, że rozmawiasz z serwerem, który Twoim zdaniem jest. – stereoscott

Powiązane problemy