2009-11-25 36 views
9

我正在尝试访问受保护的文件。服务器正在使用摘要式身份验证 - 我可以从打印出的响应中看到这一点。 下面是示例代码:为什么我的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身份验证协议,该怎么办?在这种情况下我该怎么办?

任何快速帮助,高度赞赏!

+0

尝试从'“删除HTTP端口号,解决了这个:/ /somesite.com:80" '。 – 2009-11-25 18:54:33

+2

这不是端口,但http://应该被删除 - 谢谢Ivan – Ram 2009-11-26 05:10:49

回答

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

谢谢.... gbacon ...删除证书主机中的“http://”解决了这个问题。非常感谢。无论如何,我们正在说80号港口,所以我们不需要说http我猜 – Ram 2009-11-26 04:37:19

+0

不客气! – 2009-11-26 13:41:59

3

当你有此类问题,请使用HTTP嗅探器来观看交易,所以你可以看到标题您程序正在发送。在这种情况下,您可能根本没有发送凭证,因为HTTP状态是401而不是403。这通常意味着您的凭据出现了错误,如gbacon notes in his answer

8

HTTP GET请求Authed也可以做如下

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); 
+0

即使服务器未在401响应中提供领域名称,该方法似乎也能正常工作。 – Charley 2016-01-25 09:02:41

0

我通过在Red Hat安装Perl-NTLM.noarch 7

相关问题