2012-12-11 33 views
13

Sau khi xem rất nhiều, tôi đã tìm thấy một số giải pháp mà dường như làm việc, nhưng không phải cho tôi ...Làm cách nào để thực hiện xác thực cơ bản qua HTTP trong Ruby?

Ví dụ, tôi có kịch bản này:

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 
} 

Khi tôi chạy nó, nó mang lại cho cho tôi một trang đó yêu cầu để xác thực, nhưng nếu tôi viết URL sau trong trình duyệt, tôi nhận được vào trang web mà không vấn đề:

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

tôi cũng đã thử với mở 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") 

Nhưng kết quả là như nhau, trang web yêu cầu xác thực người dùng. Bất kỳ mẹo nào về những gì tôi đang làm sai ?. Tôi có phải mã hóa mật khẩu trong Base 64 không?

+0

Bạn đã thử thêm tên người dùng và mật khẩu vào URL, giống như cách bạn sẽ đặt nó vào trình duyệt? –

+0

Có, tất nhiên, nhưng cách đó không được hỗ trợ cho các thư viện đó. –

Trả lời

33

Tôi đã viết một đoạn mã dựa trên các ví dụ được đưa ra trong Net::HTTP docs và thử nghiệm trên máy chủ WAMP cục bộ của tôi - nó hoạt động tốt. Dưới đây là những gì tôi có:

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 

Và tập tin .htaccess của tôi trông như thế này:

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

My .htpasswd chỉ là một lót được tạo ra với htpasswd -c .htpasswd matt cho mật khẩu "bí mật". Khi tôi chạy mã, tôi nhận được "200 OK" và nội dung của index.html. Nếu tôi xóa dòng request.basic_auth, tôi gặp lỗi 401.

UPDATE:

Như đã nêu bởi @stereoscott trong các ý kiến, giá trị :verify_mode tôi đã sử dụng trong ví dụ (OpenSSL::SSL::VERIFY_NONE) là không an toàn cho sản xuất.

Tất cả các tùy chọn có sẵn được liệt kê trong OpenSSL::SSL::SSLContext docs là: VERIFY_NONE, VERIFY_PEER, VERIFY_CLIENT_ONCE, VERIFY_FAIL_IF_NO_PEER_CERT, trong đó (theo OpenSSL docs) chỉ có hai người đầu tiên được sử dụng ở chế độ khách hàng.

Vì vậy, VERIFY_PEER nên được sử dụng trên sản xuất, trong đó is the default btw, vì vậy bạn có thể bỏ qua hoàn toàn.

+3

Yêu cầu phải là 'net/https' thay vì 'net/http' (ít nhất đó là những gì tôi phải thay đổi để làm cho nó hoạt động cho tôi) – Gu1234

+0

Điều này thực sự đã giúp cảm ơn. – Abram

+0

VERIFY_NONE không phải là tốt nhất về an ninh. Mặc dù dữ liệu được mã hóa qua SSL nhưng bạn không thể xác nhận rằng bạn đang nói chuyện với máy chủ mà bạn cho rằng. – stereoscott

Các vấn đề liên quan