2011-11-20 28 views
9

Tôi cố gắng để chạy chương trình Perl5 này:LWP :: UserAgent HTTP Basic Authentication

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

Mặt khác tôi có 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);                 
}  

Và nó chỉ in:

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 

Vì vậy, tôi thấy rằng LWP :: UserAgent không gửi xác thực cơ bản HTTP, nhưng tôi không biết tại sao.

Tôi nhìn thấy một số bài đăng trên trang web này, nhưng họ có mã này cơ bản giống nhau, và nó không công việc ...

Nếu tôi sử dụng HTTP :: Yêu cầu sau đó nó hoạt động:

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

Đầu ra:

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 

Ý của tôi làm điều gì sai trước đây?

+4

Bạn có nhận được một phản ứng 401 đã yêu cầu auth cơ bản? Bạn đã có được vương quốc phải không? Hiển thị chuỗi yêu cầu phản hồi, không chỉ yêu cầu. – ikegami

+0

Tôi cũng đặt mã cho yêu cầu & phản hồi. Và tôi đã nhận được phản hồi 401. Không hiểu câu hỏi về lĩnh vực, tôi không thấy nó quan trọng như thế nào. – XoR

+1

Tôi biết bây giờ, tôi cần phải trả lại WWW-Authenticate: Basic realm = "Secure Area", sau đó LWP :: UserAgent sẽ hoạt động, phải không? – XoR

Trả lời

19

LWP sẽ chỉ gửi thông tin xác thực cho một lĩnh vực nếu máy chủ cho biết rằng máy chủ đó đang cố gắng truy cập vào lĩnh vực đó. Một người dùng cụ thể chỉ có thể truy cập vào các cõi cụ thể hoặc có mật khẩu khác nhau cho các cõi khác nhau. LWP không biết cái nào để chọn ra các thông tin của nó mà không có vương quốc. Ngoài ra, LWP sẽ không sử dụng dữ liệu bạn lưu trữ trong thông tin đăng nhập trừ khi nó được thử thách. Bạn không làm điều đó.

Nếu bạn cung cấp thông tin xác thực trực tiếp bằng cách chỉ định tiêu đề Authorization, bạn không thực hiện kiểm tra. Bạn luôn có thể gửi bất kỳ tiêu đề nào bạn thích nếu bạn đặt nó một cách rõ ràng cho chính mình, do đó, nó không đáng ngạc nhiên khi bạn nhìn thấy nó.

Bạn chỉ cần một server test tốt hơn:

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

Khi bạn chạy khách hàng của bạn một lần, cần có hai yêu cầu:

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 
Các vấn đề liên quan