2011-11-20 19 views
9

が、私はこのperl5のプログラムを実行しようとした:一方LWP :: UserAgentの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; 

私が持っているHTTPを::デーモン:

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

そして、それだけでプリント:

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 

私はLWP :: UserAgentがHTTP Basic authを送信しないことを知っていますが、理由はわかりません。

私はこのウェブサイト上でいくつかの記事を見て、彼らはこれと同じ基本的なコードを持っている、と私はHTTP ::リクエストを使用している場合、それは 仕事...

は、それが動作しません:

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

出力:

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 

は私が間違っているの前に何かをやっていましたか?

+4

あなたは基本的な認証を要求された401応答を取得しましたか?あなたは本当に領土を手に入れましたか?要求だけでなく、要求 - 応答チェーンを表示します。 – ikegami

+0

私は要求と応答のためのコードを入れました。そして私は401応答を得た。レルムの質問について理解していない、私はそれがいかに重要であるかはわかりません。 – XoR

+1

私は今知っている、私はWWWを返す必要があります - 認証:基本領域= "セキュア領域"、次にLWP :: UserAgentは動作しますか? – XoR

答えて

19

LWPは、レルムがそのレルムにアクセスしようとしていることをサーバーが通知した場合にのみレルムの資格情報を送信します。特定のユーザーは、特定のレルムにアクセスするか、異なるレルムに対して異なるパスワードを持つことしかできません。 LWPは、レルムを持たないクレデンシャルを選択することはできません。さらに、LWPは、チャレンジされていない限り、資格情報に格納したデータを使用することはありません。あなたはそれをしていない。

Authorizationヘッダーを指定して資格情報を直接指定すると、レルムのチェックは行われません。明示的に自分自身を設定すると、あなたが好きなヘッダをいつでも送ることができるので、あなたがそれを見るのは驚くことではありません。

あなただけのより良いテストサーバーが必要になります。

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

一度あなたのクライアントを実行すると、2つの要求があるはず:

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