Базовая и формальная аутентификация с помощью Mechanize (Ruby)

Я пытаюсь войти на сайт во внутренней сети компании, на котором есть всплывающее диалоговое окно базовой проверки подлинности и проверка подлинности на основе формы. Это код, который я использую (что приводит к ошибке 401 => Net::HTTPUnauthorized):

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

Это приводит к ошибке 401 => Net::HTTPUnauthorized. Ниже приведена информация из 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

На данный момент я только пытаюсь пройти первую базовую аутентификацию. Я заметил одну вещь: сервером является IIS и в документация по Mechanize есть публичная функция gen_auth_headers(), однако в коде гема, который я использую, этой функции не существует, плюс то, что он делает в коде, мне не по плечу.

ТИА, Набс


person Nabs    schedule 13.03.2011    source источник


Ответы (2)


Метод auth будет удален в версии 3 chanize, поэтому его необходимо заменить на add_auth и укажите URI, где применяются эти учетные данные.

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
person Ivan Fraixedes    schedule 15.10.2013

Используйте 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
person fx_    schedule 14.03.2011
comment
Да, извините, я забыл включить эту строку. На самом деле, я использовал basic_auth, который является псевдонимом для аутентификации. - person Nabs; 14.03.2011
comment
Я протестировал описанное выше с помощью Mechanize 1.0.0, и это работает. Возможно, это ошибка в той версии, которую вы используете. - person fx_; 15.03.2011
comment
Я считаю, что agent.auth устарел. Вместо этого используйте agent.add_auth(область, имя пользователя, пароль) - person Ransom; 17.12.2012
comment
да, agent.auth устарело, начиная с версии 2.4. Вместо этого используйте agent.add_auth - person stmllr; 08.12.2015