2009-11-25 24 views
9

Estoy intentando acceder a un archivo protegido. El servidor está utilizando la autenticación resumida, que puedo ver desde la respuesta impresa. Aquí es el código de ejemplo:¿Por qué no funcionan mis credenciales de LWP :: UserAgent?

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; 

Nombre del reino lo tengo en la ventana emergente que consigo cuando intento acceder a ese recurso desde el navegador. El mismo nombre de usuario y contraseña funcionan extremadamente bien en el navegador y puedo ver el contenido, pero cuando ejecuto el script anterior siempre dice 401 Authorization required.

¿Cómo funciona LWP?

¿Debo pedirle a LWP que envíe MD5 hash (resumen) del nombre de usuario y contraseña o es como si internamente comprueba qué autenticación usar y envía la forma correspondiente (básica/resumida) de enviar credenciales. Mis preguntas son

  1. ¿Cómo puedo configurar LWP para que envíe resumen de nombre de usuario y contraseña?
  2. ¿Qué ocurre si el servidor utiliza el protocolo de autenticación NTLM de Windows? ¿Cómo debo ir en tal situación?

cualquier ayuda rápida es muy apreciada!

+0

intenta quitar el número de puerto del '" http://somesite.com:80 "'. –

+2

No es el puerto, pero debe eliminarse http: //. Gracias Ivan – Ram

Respuesta

18

Considere el siguiente extracto de la documentación del módulo de LWP::UserAgent:

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

obtener/establecer el nombre de usuario y la contraseña que se utilizará para un reino.

La $netloc es una cadena de la forma "<host>:<port>". El nombre de usuario y la contraseña solo se transmitirán a este servidor. Ejemplo:

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

Cambio

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

a

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

Gracias .... gbacon ... La eliminación de "http: //" en el host de credenciales resolvió el problema. Muchas gracias. De todos modos, estamos diciendo puerto no 80, así que no necesitamos decir http supongo – Ram

+0

¡De nada! –

3

Cuando se tiene este tipo de cuestiones, utilizar un sniffer HTTP para ver la transacción para que pueda ver los encabezados de su programa está enviando. En este caso, probablemente no envíe las credenciales, ya que el estado HTTP es 401 en lugar de 403. Eso generalmente significa que ha cometido un error con las credenciales, como gbacon notes in his answer.

8

HTTP GET Authed solicitud también se puede hacer de la siguiente manera

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

Este método parece funcionar incluso cuando el servidor no proporciona un nombre de dominio en 401 respuestas. – Charley

0

He resuelto mediante la instalación de Perl-NTLM.noarch en Red Hat 7.

Cuestiones relacionadas