1

У меня возникли проблемы с использованием базовой аутентификации в WWW::Mechanize. Я пытаюсь подключиться к Streak API, документация для которой гласит:Настройка основных учетных данных в WWW :: Механизация

подряд использует HTTP Basic Auth подписать каждый запрос с вашим ключом API. Просто установите имя пользователя запроса на ключ API. Поле пароля игнорируется. Все запросы должны быть сделаны через HTTPS, поскольку HTTP-запросы будут игнорироваться.

Вот пример запроса:

curl https://www.streak.com/api/v1/pipelines -u YOUR_API_KEY:

Я могу успешно получить доступ к API, используя curl таким образом. Тем не менее, я не могу успешно аутентифицироваться с помощью WWW :: Mechanize. Вот что я получил:

#!perl 

use warnings; 
use strict; 
use feature 'say'; 

use WWW::Mechanize; 

my $api = 'https://www.streak.com/api/v1/'; 

my $mech = WWW::Mechanize->new(autocheck => 0); # don't die on errors 

$mech->credentials('my API key here', ''); 

$mech->get($api . 'pipelines'); 

say $mech->response->status_line; 
say $mech->res->request->as_string; 

Запуск мне этот код получает:

401 Unauthorized 
GET https://www.streak.com/api/v1/pipelines 
Accept-Encoding: gzip 
User-Agent: WWW-Mechanize/1.83 

аутентификации даже и не пытался. Может ли кто-нибудь предположить, почему это так, и что я могу сделать, чтобы исправить это? Этот код работает в Strawberry Perl 5.24.0.1, если это может иметь какое-либо отношение к нему.

[Отредактировано включить предложение от simbabque рассмотрения объекта запроса.]

+0

Вы сравнили объект HTTP :: Request, который WWW :: Mechanize создает с запросом на завивание? Вы можете использовать '$ mech-> res-> request-> as_string', чтобы получить Perl-часть вещей, и' curl -v' для curl. – simbabque

+0

Интересно. Это показывает, что он вообще не выполняет аутентификацию: 'GET https: // www.streak.com/api/v1/pipelines' ' Accept-Encoding: gzip' 'User-Agent: WWW-Mechanize/1.83 ' –

+0

Я видел то же самое. Очень странно. Если вы используете более длинную строку, она также не делает этого. Но у меня есть код, который использует эту функцию. Мы упускаем из виду то, что я считаю. – simbabque

ответ

1

Я нашел проблему.

Следуя методике в this post on Perl Maven («Как узнать URL-адрес и область?»), Выясняется, что API не отправляет вызов для учетных данных, указав область, когда вы пытаетесь подключиться к ней. Он просто дает вам сообщение об ошибке, указывающее, что требуется базовая аутентификация. LWP :: UserAgent не знает, что делать дальше.

Итак, я скопировал заголовок аутентификации от успешного запроса завитка, что simbabque предложил изучение, и вручную установить, что на объекте агента пользователя:

$ua->default_header('Authorization' => 'Basic [Base64-encoded string here]'); 

Теперь он работает. Счастливые времена.

+0

kudos для выяснения этого и размещения его здесь. – xxfelixxx

+0

Эй, спасибо @xxfelixxx. Надеюсь, это будет полезно для всех, кто использует WWW :: Mechanize и сталкивается с ресурсом, который не выполняет аутентификацию должным образом. Как оказалось, этот API нарушает [RFC 7235 (HTTP/1.1): аутентификация) раздел 3.1.] (Https://tools.ietf.org/html/rfc7235#section-3.1), не сопровождающий 401 Несанкционирован заголовком WWW-Authenticate. –