我正在尝试访问受保护的文件。服务器正在使用摘要式身份验证 - 我可以从打印出来的响应中看到。 以下是示例代码:
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哈希(摘要),或者在内部检查使用哪种身份验证并发送相应的(基本/摘要)发送凭据的方式。 我的问题是
非常感谢任何快速帮助!
答案 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解决了这个问题。