9

保護されたファイルにアクセスしようとしています。サーバーはダイジェスト認証を使用しています。これは、出力された応答から確認できます。サンプルコードは次のとおりです。

use LWP;
use strict;

my $url = 'http://somesite.com/aa/bb/cc.html';
my $username = 'scott';
my $password = 'tiger';

my $browser = LWP::UserAgent->new('Mozilla');
$browser->credentials("http://somesite.com:80","realm-name",$username=>$password);
my $response=$browser->get($url);

print $response->content;

ブラウザからそのリソースにアクセスしようとしたときに表示されるポップアップ ウィンドウから取得したレルムの名前。同じユーザー名とパスワードがブラウザで非常にうまく機能しており、コンテンツを表示できますが、上記のスクリプトを実行すると常に401 Authorization required.

LWP はどのように機能しますか?

LWP にユーザー名とパスワードの MD5 ハッシュ (ダイジェスト) を送信するように依頼する必要がありますか?それとも、使用する認証を内部的にチェックし、資格情報を送信する対応する (基本/ダイジェスト) 方法を送信するようなものですか? 私の質問は

  1. ユーザー名とパスワードのダイジェストを送信するように LWP を設定するにはどうすればよいですか?
  2. サーバーが Windows NTLM 認証プロトコルを使用している場合はどうなりますか? このような状況で、私はどのように行動すればよいでしょうか?

迅速なヘルプをいただければ幸いです。

4

4 に答える 4

18

LWP::UserAgentモジュールのドキュメントからの次の抜粋を検討してください。

$ua->credentials( $netloc, $realm )
$ua->credentials( $netloc, $realm, $uname, $pass )

レルムに使用するユーザー名とパスワードを取得/設定します。

$netloc、 の形式の文字列です"<host>:<port>"。ユーザー名とパスワードは、このサーバーにのみ渡されます。例:

$ua->credentials("www.example.com:80", "Some Realm", "foo", "secret");

変化する

$browser->credentials("http://somesite.com:80","realm-name",$username=>$password);

$browser->credentials("somesite.com:80","realm-name",$username=>$password);
于 2009-11-25T19:04:02.440 に答える
3

このような問題が発生した場合は、HTTP スニファーを使用してトランザクションを監視し、プログラムが送信しているヘッダーを確認してください。この場合、HTTP ステータスが 403 ではなく 401 であるため、資格情報をまったく送信していない可能性があります。gbacon が回答で指摘しているように、これは通常、資格情報を間違えたことを意味します。

于 2009-11-26T01:17:57.843 に答える
0

Red Hat 7 に perl-NTLM.noarch をインストールすることでこれを解決しました。

于 2016-01-12T13:24:24.163 に答える