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

Ram*_*Ram 9 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;
Run Code Online (Sandbox Code Playgroud)

当我尝试从浏览器访问该资源时,我从弹出窗口获取它的领域的名称.相同的用户名和密码在浏览器中工作得非常好,我能够看到内容,但是当我运行上面的脚本时,它总是说401 Authorization required.

LWP如何运作?

我是否需要要求LWP发送用户名和密码的MD5哈希(摘要),或者它是否在内部检查要使用的身份验证并发送相应的(基本/摘要)发送凭据的方式.我的问题是

  1. 如何设置LWP以便它发送用户名和密码的摘要?
  2. 如果服务器使用Windows NTLM身份验证协议怎么办?在这种情况下我该怎么办呢?

任何快速帮助都非常感谢!

Gre*_*con 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");
Run Code Online (Sandbox Code Playgroud)

更改

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

$browser->credentials("somesite.com:80","realm-name",$username=>$password);
Run Code Online (Sandbox Code Playgroud)


rda*_*mon 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 );
Run Code Online (Sandbox Code Playgroud)

  • 即使服务器未在401响应中提供域名,此方法似乎也能正常工作. (3认同)