2011-03-13 4 views
6

J'essaie de me connecter à un site sur l'intranet de l'entreprise qui comporte une boîte de dialogue contextuelle d'authentification de base et une authentification basée sur un formulaire. Voici le code que je utilise (ce qui se traduit par un 401 => Net :: erreur HTTPUnauthorized):Authentification de base et de formulaire avec Mechanize (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 

Il en résulte un 401 => Net :: erreur HTTPUnauthorized. Ci-dessous est mech.log info:

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 

À ce stade, j'essaie seulement de passer la première authentification de base. J'ai remarqué une chose qui est que le serveur est IIS et dans le Mechanize documentation il y a une fonction publique appelée gen_auth_headers(), mais dans le code de la gemme que j'utilise cette fonction n'existe pas, plus ce qu'il fait dans le code me dépasse.

TIA, Nabs

Répondre

6

Utilisez 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

Droit, désolé j'ai oublié d'inclure cette ligne. En fait, j'ai utilisé basic_auth qui est un alias pour auth – Nabs

+0

J'ai testé ce qui précède avec Mechanize 1.0.0 et cela fonctionne. Peut-être un bug dans la version que vous utilisez alors. –

+3

Je crois que agent.auth est maintenant obsolète. Au lieu de cela, utilisez agent.add_auth (domaine, nom d'utilisateur, mot de passe) –

10

méthode auth sera supprimée dans la version de mécaniser 3, donc il doit être remplacé par add_auth et fournir l'URI où ces informations d'identification sont applicables.

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 
Questions connexes