2011-11-20 25 views
9

me trató de ejecutar este programa perl5:LWP :: agente de usuario de autenticación básica HTTP

#!/usr/bin/env perl                

use strict;                  
use warnings;                 
use LWP;                   

my $ua = LWP::UserAgent->new('Mozilla');           
$ua->credentials("test.server.com:39272", "realm-name", 'user_name', 'some_pass');      
my $res = $ua->get('http://test.server.com:39272/');     

print $res->content; 

Por otro lado tengo HTTP :: Daemon:

#!/usr/bin/env perl                      

use strict;                  
use warnings;                 

use HTTP::Daemon;                

my $hd = HTTP::Daemon->new or die;            

print "Contact URL: ", $hd->url, "\n";           
while (my $hc = $hd->accept) {             
    while (my $hr = $hc->get_request) {           
    if ($hr->method eq 'GET') {             
     print $hr->as_string, "\n";            
    }                   
    }                    
    $hc->close;                 
    undef($hc);                 
}  

y que sólo se imprime:

Contact URL: http://test.server.com:39272/ 
GET/HTTP/1.1 
Connection: TE, close 
Host: test.server.com:39272 
TE: deflate,gzip;q=0.3 
User-Agent: libwww-perl/6.03 

Así que vemos que LWP :: agente de usuario no envía HTTP de autenticación básica, pero no sé qué.

he visto algunos post en este sitio web, pero tienen el mismo código básico, y no lo hace trabajo ...

Si uso HTTP :: Solicitud entonces funciona:

my $req = GET 'http://test.server.com:39272/';       
$req->authorization_basic('my_id', 'my_pass');         
my $res = $ua->request($req); 

Salidas:

GET/HTTP/1.1 
Connection: TE, close 
Authorization: Basic bXlfaWQ6bXlfcGFzcw== 
Host: test.server.com:39272 
TE: deflate,gzip;q=0.3 
User-Agent: libwww-perl/6.03 

¿he hecho algo mal antes?

+4

¿Recibió una respuesta 401 que solicita autenticación básica? ¿Conociste el reino, verdad? Muestre la cadena de solicitud-respuesta, no solo la solicitud. – ikegami

+0

Bueno, puse el código para solicitud y respuesta. Y obtuve una respuesta 401. No entiendo sobre la cuestión del reino, no veo cómo eso es importante. – XoR

+1

Lo sé ahora, tengo que devolver WWW-Authenticate: Basic realm = "Área segura", entonces LWP :: UserAgent funcionará, ¿verdad? – XoR

Respuesta

19

LWP sólo enviará las credenciales de un reino si el servidor ha dicho que de que está tratando de acceder a ese reino. Un usuario en particular solo puede acceder a dominios particulares o tener contraseñas diferentes para diferentes dominios. LWP no sabe cuál seleccionar de sus credenciales sin el reino. Además, LWP no va a utilizar los datos que almacena en las credenciales a menos que se haya cuestionado. No estás haciendo eso.

Si proporciona las credenciales directamente mediante la especificación de la cabecera Authorization, lo hace la comprobación ningún reino. Siempre puede enviar el encabezado que desee si lo configura de manera explícita usted mismo, por lo que no es sorprendente que lo vea.

Sólo se necesita un mejor servidor de prueba:

use strict;                  
use warnings;                 

use HTTP::Daemon;                
use HTTP::Status; 

my $server = HTTP::Daemon->new or die;            

print "Contact URL: ", $server->url, "\n";           
while (my $connection = $server->accept) {             
    while (my $request = $connection->get_request) {           
     print $request->as_string; 
     unless($request->header('Authorization')) {             
      $connection->send_response(make_challenge())            
      } 
     else { 
      $connection->send_response(make_response())            
      } 
     }                    
    $connection->close;                 
    } 

sub make_challenge { 
    my $response = HTTP::Response->new( 
     401 => 'Authorization Required', 
     [ 'WWW-Authenticate' => 'Basic realm="Buster"' ], 
     ); 
    } 

sub make_response { 
    my $response = HTTP::Response->new( 
     200 => 'Huzzah!', 
     [ 'Content-type' => 'text/plain' ], 
     ); 

    $response->message('Huzzah!'); 
    } 

Cuando se ejecuta el cliente una vez, no debe haber dos solicitudes:

GET/HTTP/1.1 
Connection: TE, close 
Host: macpro.local:52902 
TE: deflate,gzip;q=0.3 
User-Agent: libwww-perl/6.02 

GET/HTTP/1.1 
Connection: TE, close 
Authorization: Basic dXNlcl9uYW1lOnNvbWVfcGFzcw== 
Host: macpro.local:52902 
TE: deflate,gzip;q=0.3 
User-Agent: libwww-perl/6.02 
Cuestiones relacionadas