2012-12-11 15 views
13

एक बहुत देखने के बाद, मैं कुछ समाधान है कि काम करने लगते हैं मिल गया है, लेकिन मेरे लिए नहीं ...रूबी में HTTP पर मूल प्रमाणीकरण कैसे करें?

उदाहरण के लिए, मैं इस स्क्रिप्ट है:

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 
} 

जब मैंने इसे चलाने के लिए, यह देता है मुझे एक पेज है कि प्रमाणीकरण के लिए अनुरोध करता है, लेकिन अगर मैं ब्राउज़र में निम्न URL लिखते हैं, मैं समस्याओं के बिना वेबसाइट में मिल:

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

मैं भी खुले 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") 

लेकिन परिणाम वही है, साइट उपयोगकर्ता प्रमाणीकरण के लिए पूछ रही है। मैं क्या गलत कर रहा हूँ के बारे में कोई सुझाव? क्या मुझे बेस 64 में पासवर्ड एन्कोड करना चाहिए?

+0

क्या आपने यूआरएल में उपयोगकर्ता नाम और पासवर्ड जोड़ने की कोशिश की है, वैसे ही आप इसे ब्राउज़र में डाल देंगे? –

+0

हां, ज़ाहिर है, लेकिन वह तरीका उन पुस्तकालयों के लिए समर्थित नहीं है। –

उत्तर

33

मैंने Net::HTTP docs में दिए गए उदाहरणों के आधार पर कोड का एक टुकड़ा लिखा और इसे मेरे स्थानीय WAMP सर्वर पर परीक्षण किया - यह ठीक काम करता है। यहाँ मैं क्या है:

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 

और मेरे .htaccess फ़ाइल इस तरह दिखता है:

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

मेरे .htpasswd सिर्फ एक एक पासवर्ड "गुप्त" के लिए htpasswd -c .htpasswd matt साथ उत्पन्न लाइनर है। जब मैं अपना कोड चलाता हूं तो मुझे "200 ओके" और index.html की सामग्री मिलती है। अगर मैं request.basic_auth लाइन हटा देता हूं, तो मुझे 401 त्रुटि मिलती है।

अद्यतन:

टिप्पणी में @stereoscott ने संकेत के रूप में, :verify_mode मूल्य मैं उदाहरण (OpenSSL::SSL::VERIFY_NONE) में इस्तेमाल उत्पादन के लिए सुरक्षित नहीं है।

सभी उपलब्ध OpenSSL::SSL::SSLContext डॉक्स में सूचीबद्ध विकल्प हैं: VERIFY_NONE, VERIFY_PEER, VERIFY_CLIENT_ONCE, VERIFY_FAIL_IF_NO_PEER_CERT, जिसमें से (OpenSSL docs के अनुसार) केवल पहले दो लोगों को ग्राहक मोड में उपयोग किया जाता है।

तो VERIFY_PEER उत्पादन पर उपयोग किया जाना चाहिए, जो is the default बीटीडब्ल्यू है, ताकि आप इसे पूरी तरह से छोड़ सकें।

+3

'net/http' की बजाय आवश्यकताएं 'नेट/https' होनी चाहिए (कम से कम जो मुझे इसे मेरे लिए काम करने के लिए बदलना था) – Gu1234

+0

यह वास्तव में धन्यवाद में मदद करता है। – Abram

+0

सुरक्षा के मामले में VERIFY_NONE सबसे अच्छा नहीं है। यद्यपि डेटा एसएसएल पर एन्क्रिप्ट किया गया है, लेकिन आप यह पुष्टि नहीं कर सकते कि आप उस सर्वर से बात कर रहे हैं जो आपको लगता है कि आप हैं। – stereoscott

संबंधित मुद्दे