在WWW :: Mechanize

时间:2016-11-03 15:04:01

标签: perl authentication credentials www-mechanize strawberry-perl

我在WWW::Mechanize中使用基本身份验证时遇到问题。我正在尝试连接到Streak API,其状态为

的文档
  

Streak使用HTTP Basic Auth使用您的API密钥对每个请求进行签名。只需将请求的用户名设置为API密钥即可。密码字段将被忽略。所有请求都必须通过HTTPS进行,因为HTTP请求将被忽略。

     

这是一个示例请求:

     

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

我可以用这种方式使用curl成功访问API。但是,我无法使用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的建议。]

1 个答案:

答案 0 :(得分:2)

我发现了问题。

遵循this post on Perl Maven中的技术(“如何查找URL和领域?”),结果证明当您尝试连接时,API不会发送凭据挑战,指定领域它。它只是给出一条错误消息,指出需要进行基本身份验证。 LWP :: UserAgent当时不知道该怎么做。

因此,我从simbabque建议检查的成功curl请求中复制了身份验证标头,并在user-agent对象上手动设置了该标头:

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

现在它有效。快乐时光。