LWP :: UserAgent HTTP Basic Authentication - PullRequest
       55

LWP :: UserAgent HTTP Basic Authentication

9 голосов
/ 20 ноября 2011

Я пытался запустить эту программу perl5:

 #!/usr/bin/env perl                                                             

use strict;                                                                     
use warnings;                                                                   
use LWP;                                                                        

my $ua = LWP::UserAgent->new('Mozilla');                                        
$ua->credentials("test.server.com:39272", "realm-name", 'user_name', 'some_pass');                       
my $res = $ua->get('http://test.server.com:39272/');                  

print $res->content;

С другой стороны, у меня есть HTTP :: Daemon:

#!/usr/bin/env perl                                                                                       

use strict;                                                                     
use warnings;                                                                   

use HTTP::Daemon;                                                               

my $hd = HTTP::Daemon->new or die;                                              

print "Contact URL: ", $hd->url, "\n";                                          
while (my $hc = $hd->accept) {                                                  
  while (my $hr = $hc->get_request) {                                           
    if ($hr->method eq 'GET') {                                                 
      print $hr->as_string, "\n";                                               
    }                                                                           
  }                                                                             
  $hc->close;                                                                   
  undef($hc);                                                                   
}    

И он просто печатает:

Contact URL: http://test.server.com:39272/
GET / HTTP/1.1
Connection: TE, close
Host: test.server.com:39272
TE: deflate,gzip;q=0.3
User-Agent: libwww-perl/6.03

Итак, я вижу, что LWP :: UserAgent не отправляет HTTP Basic auth, но я не знаю почему.

Я видел некоторые посты на этом веб-сайте, но у них такой же базовый код,и это не работает ...

Если я использую HTTP :: Request, то это работает:

my $req = GET 'http://test.server.com:39272/';                        
$req->authorization_basic('my_id', 'my_pass');                                  
my $res = $ua->request($req);

Выводы:

GET / HTTP/1.1
Connection: TE, close
Authorization: Basic bXlfaWQ6bXlfcGFzcw==
Host: test.server.com:39272
TE: deflate,gzip;q=0.3
User-Agent: libwww-perl/6.03

Я сделал что-тоне так раньше?

1 Ответ

19 голосов
/ 21 ноября 2011

LWP отправит учетные данные для области только в том случае, если сервер сообщил, что пытается получить доступ к этой области.Определенный пользователь может иметь доступ только к конкретным областям или иметь разные пароли для разных областей.LWP не знает, какой из них выбрать из своих полномочий без сферы.Кроме того, LWP не будет использовать данные, которые вы храните в учетных данных, если они не были оспорены.Вы этого не делаете.

Если вы предоставляете учетные данные напрямую, указав заголовок Authorization, проверка области не выполняется.Вы всегда можете отправить любой заголовок, который вам нравится, если вы установили его явно, так что неудивительно, что вы видите его.У вашего клиента один раз должно быть два запроса:

GET / HTTP/1.1
Connection: TE, close
Host: macpro.local:52902
TE: deflate,gzip;q=0.3
User-Agent: libwww-perl/6.02

GET / HTTP/1.1
Connection: TE, close
Authorization: Basic dXNlcl9uYW1lOnNvbWVfcGFzcw==
Host: macpro.local:52902
TE: deflate,gzip;q=0.3
User-Agent: libwww-perl/6.02
...