Почему мои учетные данные 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 отправить хэш MD5 (дайджест) имени пользователя и пароля, или это похоже на то, как внутри он проверяет, какую аутентификацию использовать, и отправляет соответствующий (базовый/дайджест) способ отправки учетных данных. Мои вопросы

  1. Как я могу настроить LWP, чтобы он отправлял дайджест имени пользователя и пароля?
  2. Что делать, если сервер использует протокол проверки подлинности Windows NTLM? Как мне поступить в такой ситуации?

любая быстрая помощь высоко ценится!


person Ram    schedule 25.11.2009    source источник
comment
Попробуйте удалить номер порта из "http://somesite.com:80".   -  person Ivan Nevostruev    schedule 25.11.2009
comment
Это не порт, а http:// надо убрать - спасибо Иван   -  person Ram    schedule 26.11.2009


Ответы (4)


Рассмотрим следующий отрывок из документации модуля 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);

to

$browser->credentials("somesite.com:80","realm-name",$username=>$password);
person Greg Bacon    schedule 25.11.2009
comment
Спасибо....gbacon... Удаление http:// в хосте учетных данных решило проблему. Большое спасибо. В любом случае, мы говорим о порте № 80, поэтому нам не нужно говорить http, я думаю - person Ram; 26.11.2009

Аутентифицированный запрос HTTP GET также можно выполнить следующим образом.

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 );
person rda3mon    schedule 18.04.2013
comment
Этот метод работает, даже если сервер не предоставляет имя области в ответах 401. - person Charley; 25.01.2016

Если у вас возникают подобные проблемы, используйте HTTP-сниффер для наблюдения за транзакцией, чтобы вы могли видеть заголовки, которые отправляет ваша программа. В этом случае вы, вероятно, вообще не отправляете учетные данные, поскольку статус HTTP равен 401 вместо 403. Обычно это означает, что вы допустили ошибку с учетными данными, как Гбэкон отмечает в своем ответе.

person brian d foy    schedule 26.11.2009

Я решил эту проблему, установив perl-NTLM.noarch на Red Hat 7.

person Templum Iovis    schedule 12.01.2016