【发布时间】:2015-09-22 06:42:07
【问题描述】:
我正在尝试让 Mojo::UserAgent 通过 NTLM 进行身份验证。大致是这样的:
use Mojo::UserAgent;
use Mojo::URL;
use Data::Dump qw/dump/;
use Path::Tiny;
use Authen::NTLM;
$\ = "\n"; $|++;
my $ntlm = Authen::NTLM-> new(host => "some.hidden.pl", user => 'foo',
domain => "bar", password => "baz", version => 2);
my $xml = path($ARGV[0])->slurp;
my $ua = Mojo::UserAgent->new;
my $url = Mojo::URL->new('https://some.hidden.pl/ews/exchange.asmx');
$url->userinfo(sprintf('%s\%s:%s', qw/bar foo baz/));
my $tx = $ua->get($url);
my $tx = $ua->build_tx(GET => $url);
$challenge = $ntlm->challenge;
$tx->req->headers->header('Authorization' => 'NTLM ' . $challenge);
$ua->start($tx);
$challenge = [ split /,\s*/, $tx->res->headers->header('www-authenticate') ]->[0] =~ s/NTLM //r;
$challenge = $ntlm->challenge($challenge);
my $tx = $ua->build_tx(GET => $url);
$tx->req->headers->header('Authorization' => 'NTLM ' . $challenge);
$ua->start($tx);
$tx = $ua->build_tx(POST => $url, {'Content-Type' => 'text/xml'}, $xml );
$tx->req->headers->content_type('text/xml');
$tx->req->headers->header('Authorization' => 'NTLM ' . $challenge);
$ua->start($tx);
print dump $tx->res;
但我在服务器第二次响应时不断收到 401。
我做错了什么?使用 Kerberos 身份验证是否更容易(如果是,如何使用)?
谢谢
【问题讨论】:
-
您是否考虑过 curl 作为替代方案?
-
我在 bash 脚本中尝试过 curl - 就像一个魅力。 perl 库的学习曲线有点陡峭。我也尝试过使用 ntlm auth 的 LWP::UserAgent,但失败了。由于这是 Mojolicious 应用程序的一部分,我想尝试并坚持使用 Mojo::UserAgent。我也会尝试 WWW::Mechanize 和 LWP::Protocol::Net::Curl。
-
有一个SPNEGO pluginfür LWP,我报告了一些错误,但作者拒绝修复它们。我不会用它。
-
您有使用 curl --debug 的工作会话吗?你能注意到它与标题有何不同... mojo 返回?
-
是的,并且 curl 工作正常。发送的第一个标头是相同的,但随后的标头不同 - 如果我没记错的话,包括从服务器返回的第一个挑战(我现在不在工作)
标签: perl ntlm mojolicious