2011-11-20 17 views
9

Próbowałem uruchomić ten program perl5:LWP :: UserAgent podstawowego uwierzytelniania 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; 

Z drugiej strony mam 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);                 
}  

i po prostu drukuje:

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 

Widzę więc, że LWP :: UserAgent nie wysyła uwierzytelniania HTTP Basic, ale nie wiem dlaczego.

widziałem jakiś post na tej stronie, ale mają ten sam kod podstawowy, a nie pracy ...

Jeśli używam HTTP :: Zapytanie to działa:

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

Wyjścia:

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 

Czy zrobiłem coś złego przed?

+4

dostałeś 401 odpowiedzi, który zażądał podstawowe auth? Czy uzyskałeś prawo królestwa? Pokaż łańcuch żądanie-odpowiedź, a nie tylko żądanie. – ikegami

+0

Cóż, umieszczam kod dla zapytania i odpowiedzi. Otrzymałem odpowiedź 401. Nie rozumiem pytania o obszar, nie widzę, jak to jest ważne. – XoR

+1

Wiem teraz, muszę zwrócić WWW-Authenticate: Basic realm = "Secure Area", wtedy LWP :: UserAgent zadziała, prawda? – XoR

Odpowiedz

19

LWP będzie wysyłać tylko poświadczenia dla dziedziny, jeśli serwer powie mu, że próbuje uzyskać dostęp do tej dziedziny. Określony użytkownik może mieć dostęp tylko do określonych dziedzin lub mieć różne hasła dla różnych dziedzin. LWP nie wie, który wybierze swoje referencje bez królestwa. Ponadto LWP nie będzie używać danych przechowywanych w referencjach, o ile nie zostanie zakwestionowane. Nie robisz tego.

Jeśli podasz dane uwierzytelniające bezpośrednio, podając nagłówek Authorization, nie sprawdzasz rzeczywistości. Zawsze możesz wysłać dowolny nagłówek, który Ci się podoba, jeśli ustawisz go samodzielnie, więc nie jest zaskoczeniem, że go widzisz.

Trzeba tylko lepszy serwer testowy:

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

Po uruchomieniu klienta raz, nie powinno być dwa wnioski:

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 
Powiązane problemy