2009-11-25 16 views
9

Sto tentando di accedere a un file protetto. Il server sta usando l'autenticazione digest - che posso vedere dalla risposta stampata. Ecco il codice di esempio:Perché le mie credenziali LWP :: UserAgent non funzionano?

use LWP; 
use strict; 

my $url = 'http://somesite.com/aa/bb/cc.html'; 
my $username = 'scott'; 
my $password = 'tiger'; 

my $browser = LWP::UserAgent->new('Mozilla'); 
$browser->credentials("http://somesite.com:80","realm-name",$username=>$password); 
my $response=$browser->get($url); 

print $response->content; 

Nome del regno ho preso dalla finestra pop-up che ottengo quando provo ad accedere a quella risorsa dal browser. Lo stesso nome utente e password stanno funzionando perfettamente nel browser e sono in grado di vedere il contenuto ma quando eseguo lo script sopra indicato, dice sempre 401 Authorization required.

Come funziona LWP?

Devo chiedere a LWP di inviare l'hash MD5 (digest) del nome utente e della password o è come se internamente controllasse l'autenticazione da utilizzare e inviasse il modo corrispondente (base/digest) di inviare le credenziali. Le mie domande sono

  1. Come posso impostare LWP in modo che invii il digest di username e password?
  2. Cosa succede se il server utilizza il protocollo di autenticazione Windows NTLM? Come dovrei andare in una situazione del genere?

qualsiasi aiuto rapido è molto apprezzato!

+0

tenta di rimuovere il numero di porta da '" http://somesite.com:80" '. –

+2

Non è la porta ma http: // deve essere rimosso - grazie Ivan – Ram

risposta

18

Si consideri il seguente estratto dalla documentazione del modulo LWP::UserAgent:

$ua->credentials($netloc, $realm)
$ua->credentials($netloc, $realm, $uname, $pass)

get/set il nome utente e la password da utilizzare per un regno.

Il $netloc è una stringa del modulo "<host>:<port>". Il nome utente e la password verranno passati solo a questo server. Esempio:

$ua->credentials("www.example.com:80", "Some Realm", "foo", "secret"); 

Change

$browser->credentials("http://somesite.com:80","realm-name",$username=>$password); 

a

$browser->credentials("somesite.com:80","realm-name",$username=>$password); 
+1

Grazie .... gbacon ... La rimozione di "http: //" nell'host di credenziali ha risolto il problema. Grazie mille. Ad ogni modo stiamo dicendo porta n. 80 quindi non abbiamo bisogno di dire http I guess – Ram

+0

You're welcome! –

3

Quando si dispone di questo tipo di problemi, utilizzare uno sniffer HTTP per guardare la transazione in modo da poter vedere le intestazioni tua il programma sta inviando. In questo caso, probabilmente non invii le credenziali poiché lo stato HTTP è 401 anziché 403. Ciò significa in genere che hai commesso un errore con le credenziali, come gbacon notes in his answer.

8

HTTP GET Authed richiesta può anche essere fatto come segue

use LWP::UserAgent; 

my $address = "localhost"; 
my $port = "8080"; 
my $username = "admin"; 
my $pass = "password"; 

my $browser = LWP::UserAgent->new; 
my $req = HTTP::Request->new(GET => "http://$address:$port/path"); 
$req->authorization_basic("$username", "$pass"); 
my $page = $browser->request($req); 
+0

Questo metodo sembra funzionare anche quando il server non fornisce un nome di dominio in 401 risposte. – Charley

0

Ho risolto questo con l'installazione di Perl-NTLM.noarch su Red Hat 7.

Problemi correlati