2015-09-22 2 views
0

Я пытаюсь получить Mojo :: UserAgent для аутентификации через NTLM. Rougly вот так:Как я могу использовать аутентификацию NTLM или Kerberos с помощью Mojo :: UserAgent

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 (если да, как)?

благодаря

+0

Вы заставляли локон стать альтернативой? –

+0

Я пробовал завиток в сценариях bash - работает как шарм. Библиотеки perl имеют немного крутую кривую обучения. Я также попробовал LWP :: UserAgent с ntlm auth, который не удался. Поскольку это часть приложения Mojolicious, я хотел бы попробовать придерживаться Mojo :: UserAgent. Я попробую WWW :: Mechanize и LWP :: Protocol :: Net :: Curl тоже. – simone

+0

Существует плагин [SPNEGO] (http://search.cpan.org/~agrolms/LWP-Authen-Negotiate-0.08/) для LWP, я сообщил несколько ошибок, но автор отказался их исправлять. Я бы не использовал его. –

ответ

0

Я только что опубликовал новый модуль, который должен быть очень полезным в этом отношении Mojolicious::Plugin::SPNEGO. Он довольно прост в использовании:

use Mojolicious::Lite; 

my $SERVER = 'my-ad-server.example.com'; 

app->secrets(['My secret passphrase here']); 

plugin 'SPNEGO', ad_server => $SERVER; 

get '/' => sub { 
    my $c = shift; 
    if (not $c->session('user')){ 
     $c->ntlm_auth({ 
      auth_success_cb => sub { 
       my $c = shift; 
       my $user = shift; 
       my $ldap = shift; # bound Net::LDAP::SPNEGO connection 
       $c->session('user',$user->{samaccountname}); 
       $c->session('name',$user->{displayname}); 
       my $groups = $ldap->get_ad_groups($user->{samaccountname}); 
       $c->session('groups',[ sort keys %$groups]); 
       return 1; 
      } 
     }) or return; 
    } 
} => 'index'; 

app->start; 

__DATA__ 

@@ index.html.ep 
<!DOCTYPE html> 
<html> 
<head> 
<title>NTLM Auth Test</title> 
</head> 
<body> 
<h1>Hello <%= session 'name' %></h1> 
<div>Your account '<%= session 'user' %>' belongs to the following groups:</div> 
<ul> 
% for my $group (@{session 'groups' }) { 
    <li>'<%= $group %>'</li> 
% } 
</ul> 
</body> 
</html> 

Модуль основан на недавно выпущенном также модуль Net :: LDAP :: SPNEGO, который обеспечивает основные buildingblocks для диалога SPNEGO.

+0

Спасибо! Как это будет работать с веб-службами Exchange? Или у вас есть предложение о том, как найти сервер объявлений для своей организации? – simone

+0

вы должны спросить своего сетевого администратора :) –

Смежные вопросы