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 回答
13

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 );
于 2013-04-18T17:01:25.317 回答
3

当您遇到此类问题时,请使用 HTTP 嗅探器来监视事务,以便您可以看到程序正在发送的标头。在这种情况下,您可能根本没有发送凭据,因为 HTTP 状态是 401 而不是 403。这通常意味着您在凭据方面犯了错误,正如gbacon 在他的回答中指出的那样

于 2009-11-26T01:17:57.843 回答
0

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

于 2016-01-12T13:24:24.163 回答