2009-11-25 46 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

相關問題