Xpoint
   [напомнить пароль]

LWP::UA & get_basic_credentials

Метки: [без меток]
[удл]
2008-03-19 03:37:16 [обр] MRTA[досье]

Приветствую. Столкнулся с проблемой следующего характера, а именно с проблемой прохождения через Basic-аутентификацию.
Имеем следующий PHP-скрипт:

<?php
  if (!isset($_SERVER['PHP_AUTH_USER'])) {
    header('WWW-Authenticate: Basic realm="My Realm"');
    header('HTTP/1.0 401 Unauthorized');
    echo 'Текст, отправляемый в том случае,
    если пользователь нажал кнопку Cancel';
    exit;
  } else {
    echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
    echo "<p>Вы ввели пароль {$_SERVER['PHP_AUTH_PW']}.</p>";
  }
?>

И имеем следующий Perl Скрипт:

#!/usr/bin/perl
use LWP::UserAgent;

$agent = LWP::UserAgent->new();
$request = HTTP::Request->new(
GET => "http://localhost/auth.php");
$response = $agent->request($request);
$response-> message;
$response -> is_success or die "Oshibka";

print $response->content;

sub get_basic_credentials {
 my($self, $realm, $uri) = @_;
$name = "test";
$passwd = "test";
return ($name, $passwd);
}

Вылетает с "Oshibka". Хотя в логах апача проскакивает само обращение и код 401. При попытке закомментить строку
$response -> is_success or die "Oshibka";
вылезает
echo 'Текст, отправляемый в том случае, если пользователь нажал кнопку Cancel';

В чем проблема, не понимаю? Вроде все делаю правильно, согласно докам и книге Л. Штайна. Помогите пожалуйста с решением вопроса.
Заранее благодарен.

спустя 3 часа 36 минут [обр] Dennis F. Latypoff aka funky_dennis(2/84)[досье]
подозреваю, что $response->is_success возвращает истину только при ответах 200, а у Вас 401
спустя 4 часа 36 минут [обр] Алексей Севрюков(61/1292)[досье]
MRTA[досье] как минимум: or die $response->status_line();
А возникает она потому что аутентификация не проходит, а не проходит она потому что, как мне кажется, потому что метод get_basic_credentials определен у Вас не в том пакете.
спустя 2 минуты [обр] Алексей Севрюков(61/1292)[досье]
спустя 1 час 54 минуты [обр] Роман Чемисов(36/350)[досье]

MRTA[досье]

$ua->credentials( $netloc, $realm, $uname, $pass )
Set the user name and password to be used for a realm. It is often more useful to specialize the get_basic_credentials() method instead.

Question on LWP::UserAgent attribute - $ua->credentials()

спустя 1 час 16 минут [обр] MRTA[досье]

Dennis F. Latypoff, у меня тоже были такие предположения.

Алексей Севрюков, а как узнать в каком пакете он определен?
401 Unauthorized при or die $response->status_line();
На счет FAQа. Читал до создания темы, не нашел ответа.

Роман Чемисов, спасибо за ссылку. В принципе я так и сделал, вынес get_basic_credentials в отдельную подпрограмму.
Прошел по ссылке, сделал как они пишут :

my $server = 'localhost:';
my $port_no = 80;
my $realm = 'My Realm';
my $user = 'username';
my $passwd = 'password';

$request->credentials( $server . $port_no, $realm, $user, $passwd );

Вылезает Can't locate object method "credentials" via package "HTTP::Headers"

Проблема актуальна и я пока не вижу вариантов её решения =(. Если это поможет, то я использую ActivePerl 5.8.0.804
Если кого-нибудь не затруднит, посмотрите у себя работоспособность скрипта, приведенного мной в первом посте.
Заранее спасибо.

спустя 3 часа 9 минут [обр] Алексей Севрюков(61/1292)[досье]
MRTA[досье] НЕ $request, а $ua->credentials. Это разные объекты.
спустя 3 часа 44 минуты [обр] MRTA[досье]

Алексей, спасибо!
Вопрос решен.

$agent = LWP::UserAgent->new();
$agent->credentials(
    'localhost:80',
    'My Realm',
    'username' => 'password'
  );

Спасибо всем отписавшимся! оч полезный форум.

Powered by POEM™ Engine Copyright © 2002-2005