为什么我的LWP :: UserAgent凭证不起作用?

时间:2009-11-25 18:49:16

标签: perl lwp lwp-useragent

我正在尝试访问受保护的文件。服务器正在使用摘要式身份验证 - 我可以从打印出来的响应中看到。 以下是示例代码:

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身份验证协议怎么办?在这种情况下我该怎么办呢?
  3. 非常感谢任何快速帮助!

4 个答案:

答案 0 :(得分: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);

答案 1 :(得分:12)

HTTP GET Authed Request也可以按如下方式完成

use LWP::UserAgent;

my $address = "localhost";
my $port = "8080";
my $username = "admin";
my $pass = "password";

my $browser = LWP::UserAgent->new;
my $req =  HTTP::Request->new( GET => "http://$address:$port/path");
$req->authorization_basic( "$username", "$pass" );
my $page = $browser->request( $req );

答案 2 :(得分:3)

如果遇到这些问题,请使用HTTP嗅探器观察事务,以便查看程序正在发送的标头。在这种情况下,您可能根本不会发送凭据,因为HTTP状态为401而不是403.这通常意味着您使用凭据时出错gbacon notes in his answer

答案 3 :(得分:0)

我通过在Red Hat 7上安装perl-NTLM.noarch解决了这个问题。