2011-11-20 8 views
9

ho cercato di eseguire questo programma perl5:LWP :: UserAgent autenticazione HTTP di base

#!/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; 

D'altra parte ho 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);                 
}  

e semplicemente stampe:

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 

Quindi vedo che LWP :: UserAgent non invia l'autenticazione HTTP Basic, ma non so perché.

ho visto alcuni post su questo sito web, ma hanno lo stesso codice di base, e non lo fa lavoro ...

Se uso HTTP :: Richiesta allora funziona:

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

Uscite:

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 

Ti ho fatto qualcosa di sbagliato prima?

+4

Hai avuto una risposta che ha richiesto 401 autenticazione di base? Hai avuto il regno giusto? Mostra la catena richiesta-risposta, non solo la richiesta. – ikegami

+0

Bene, metto il codice per richiesta e risposta. E ho ricevuto risposta 401. Non capisco la domanda del regno, non vedo come sia importante. – XoR

+1

Ora so, ho bisogno di restituire WWW-Authenticate: Basic realm = "Secure Area", quindi LWP :: UserAgent funzionerà, giusto? – XoR

risposta

19

LWP invierà le credenziali per un dominio solo se il server ha comunicato che sta tentando di accedere a tale area. Un particolare utente può essere in grado di accedere a particolari reami o avere password diverse per regni diversi. LWP non sa quale scegliere tra le sue credenziali senza il regno. Inoltre, LWP non utilizzerà i dati memorizzati nelle credenziali a meno che non sia stato contestato. Non lo stai facendo.

Se si forniscono le credenziali direttamente specificando l'intestazione Authorization, non si effettua il controllo del reame. Puoi sempre inviare qualsiasi intestazione che ti piace se la imposti esplicitamente da te, quindi non è sorprendente che tu la veda.

Hai solo bisogno di una migliore server di prova:

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!'); 
    } 

Quando si esegue il cliente una volta, non ci dovrebbero essere due richieste:

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