2011-03-13 31 views
6

Tôi đang cố gắng đăng nhập vào trang web trên mạng nội bộ của công ty có hộp thoại bật lên xác thực cơ bản và xác thực dựa trên biểu mẫu. Đây là mã tôi đang sử dụng (dẫn đến lỗi 401 => Net :: HTTPUnauthorized):Xác thực cơ bản và mẫu với cơ chế (Ruby)

require 'rubygems' 
require 'mechanize' 
require 'logger' 

agent = WWW::Mechanize.new { |a| a.log = Logger.new("mech.log") } 
agent.user_agent_alias = 'Windows Mozilla' 
agent.basic_auth('username','password') 
agent.get('http://example.com') do |page| 
    puts page.title 
end 

Điều này dẫn đến 401 => Net :: HTTPĐã bị lỗi. Dưới đây là thông tin mech.log:

I, [2011-03-13T17:25:21.900631 #22128] INFO -- : Net::HTTP::Get: /index.asp?LogIn=yes&action=7 
D, [2011-03-13T17:25:21.901631 #22128] DEBUG -- : request-header: accept-language => en-us,en;q=0.5 
D, [2011-03-13T17:25:21.901631 #22128] DEBUG -- : request-header: accept => */* 
D, [2011-03-13T17:25:21.901631 #22128] DEBUG -- : request-header: user-agent => Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4b) Gecko/20030516 Mozilla Firebird/0.6 
D, [2011-03-13T17:25:21.902631 #22128] DEBUG -- : request-header: connection => keep-alive 
D, [2011-03-13T17:25:21.902631 #22128] DEBUG -- : request-header: accept-encoding => gzip,identity 
D, [2011-03-13T17:25:21.902631 #22128] DEBUG -- : request-header: host => example.com 
D, [2011-03-13T17:25:21.902631 #22128] DEBUG -- : request-header: accept-charset => ISO-8859-1,utf-8;q=0.7,*;q=0.7 
D, [2011-03-13T17:25:21.903631 #22128] DEBUG -- : request-header: keep-alive => 300 
D, [2011-03-13T17:25:22.813722 #22128] DEBUG -- : Read 24 bytes 
D, [2011-03-13T17:25:22.814722 #22128] DEBUG -- : response-header: content-type => text/html 
D, [2011-03-13T17:25:22.815722 #22128] DEBUG -- : response-header: connection => close 
D, [2011-03-13T17:25:22.815722 #22128] DEBUG -- : response-header: www-authenticate => Negotiate, NTLM, Basic realm="example.com" 
D, [2011-03-13T17:25:22.816722 #22128] DEBUG -- : response-header: date => Sun, 13 Mar 2011 11:55:21 GMT 
D, [2011-03-13T17:25:22.817722 #22128] DEBUG -- : response-header: server => Microsoft-IIS/5.0 
D, [2011-03-13T17:25:22.817722 #22128] DEBUG -- : response-header: content-length => 24 
I, [2011-03-13T17:25:22.819723 #22128] INFO -- : status: 401 

Tại thời điểm này, tôi chỉ cố gắng vượt qua xác thực cơ bản đầu tiên. Tôi đã nhận thấy một điều đó là máy chủ là IIS và trong Mechanize documentation có một chức năng công cộng được gọi là gen_auth_headers(), tuy nhiên trong mã của đá quý tôi đang sử dụng chức năng này không tồn tại, cộng với những gì anh ta đang làm mã nằm ngoài tôi.

TIA, nabs

Trả lời

6

Sử dụng Mechanize#auth

require 'rubygems' 
require 'mechanize' 
require 'logger' 

agent = WWW::Mechanize.new { |a| a.log = Logger.new("mech.log") } 
agent.user_agent_alias = 'Windows Mozilla' 
agent.auth('username', 'password') 
agent.get('http://example.com') do |page| 
    puts page.title 
end 
+0

Phải, xin lỗi tôi quên bao gồm dòng đó. Trên thực tế, tôi đã sử dụng basic_auth, một bí danh cho auth – Nabs

+0

Tôi đã thử nghiệm ở trên với Mechanize 1.0.0 và nó hoạt động. Có thể là một lỗi trong bất kỳ phiên bản bạn đang sử dụng sau đó. –

+3

Tôi tin rằng agent.auth hiện không còn được dùng nữa. Thay vào đó, hãy sử dụng agent.add_auth (lĩnh vực, tên người dùng, mật khẩu) –

10

auth phương pháp sẽ được loại bỏ trong mechanize phát hành 3, vì vậy nó phải được thay thế bằng add_auth và cung cấp URI nơi những thông tin được áp dụng.

require 'rubygems' 
require 'mechanize' 

agent = Mechanize.new 
agent.user_agent_alias = 'Windows Mozilla' 
agent.add_auth('http://example.com', 'username', 'password') 
agent.get('http://example.com') do |page| 
    puts page.title 
end 
Các vấn đề liên quan