2009-11-25 16 views
9

Ich versuche auf eine geschützte Datei zuzugreifen. Der Server verwendet die Digest-Authentifizierung - was ich anhand der ausgedruckten Antwort sehen kann. Hier ist der Beispielcode:Warum funktionieren meine LWP :: UserAgent-Anmeldeinformationen nicht?

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; 

Namen des Reiches ich es aus dem Popup-Fenster habe ich bekommen, wenn ich versuche, aus dem Browser auf diese Ressource zugreifen. Derselbe Benutzername und das gleiche Kennwort funktionieren im Browser sehr gut und ich kann den Inhalt sehen, aber wenn ich das obige Skript ausführe, heißt es immer 401 Authorization required.

Wie funktioniert LWP?

Muss ich LWP bitten, MD5-Hash (Digest) des Benutzernamens und des Passworts zu senden, oder ist es intern wie geprüft, welche Authentifizierung zu verwenden ist und sendet die entsprechende (Basic/Digest) Art des Sendens von Anmeldeinformationen. Meine Fragen sind

  1. Wie kann ich LWP so einstellen, dass es Digest von Benutzername und Passwort sendet?
  2. Was passiert, wenn der Server Windows NTLM-Authentifizierungsprotokoll verwendet? Wie soll ich in einer solchen Situation vorgehen?

jede schnelle Hilfe wird sehr geschätzt!

+0

Versuchen zu entfernen Portnummer von '" http durch die Installation gelöst://somesite.com:80 "'. –

+2

Es ist nicht Port, aber http: // sollte entfernt werden - danke Ivan – Ram

Antwort

18

Betrachten Sie den folgenden Auszug aus der Dokumentation des LWP::UserAgent Modul:

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

Get/den Benutzernamen und das Passwort festgelegt für einen Bereich verwendet werden.

Die $netloc ist eine Zeichenfolge der Form "<host>:<port>". Der Benutzername und das Passwort werden nur an diesen Server weitergegeben. Beispiel:

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

ändern

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

zu

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

Danke .... gbacon ... Entfernen "http: //" in Anmeldeinformationen Host löste das Problem. Ich danke dir sehr. Wie auch immer, wir sagen Port Nr. 80, also müssen wir nicht http sagen, ich denke – Ram

+0

Gern geschehen! –

3

Wenn Sie diese Art von Fragen haben, einen HTTP-Sniffer verwenden, um die Transaktion zu sehen, so dass Sie auf die Header können Ihre Programm sendet. In diesem Fall senden Sie die Anmeldeinformationen wahrscheinlich überhaupt nicht, da der HTTP-Status 401 statt 403 lautet. Das bedeutet normalerweise, dass Sie mit den Anmeldeinformationen einen Fehler gemacht haben, z. B. gbacon notes in his answer.

8

HTTP GET Authed Anfrage auch getan werden kann als

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

Diese Methode scheint zu funktionieren, selbst wenn der Server in 401-Antworten keinen Bereichsnamen angibt. – Charley

0

folgt ich das Perl-NTLM.noarch auf Red Hat 7.

Verwandte Themen