Perl REST :: Client通过cookie获取和使用CSRFToken和会话ID的最佳方式

时间:2013-05-23 12:45:30

标签: perl rest cookies csrf lwp

所以现在我正在使用REST :: Client,它在制作GET请求和获取JSON数据方面表现非常出色。但是,在发出POST请求时,有问题的API应该传递CSRF令牌和会话ID,然后如果通过JSON输入正确的凭据,则应该进一步使用所有POST请求。

事实是,我看不到使用REST :: CLient获取cookie的方法,所以我尝试了LWP,我能够执行JSON请求,设置cookie设置但仍然没有cookie。

我尝试将其存储在一个文件中,尝试使用变量,但仍然没有

$mech->cookie_jar($cookies);

那么如何获取这些cookie?

P.S我确定请求已执行,因为我看到了正确的输出,而且我看到了第三方休息客户端的cookie。

编辑:

#!/usr/bin/perl

use REST::Client;
use JSON;
use Data::Dumper;
use MIME::Base64;
use 5.010;
use LWP::UserAgent;
use HTTP::Cookies;

my $first = $ARGV[0];

my $username = 'user@user.com';
my $password = 'password';
my $cookies = HTTP::Cookies->new();
my $ua = LWP::UserAgent->new( cookie_jar => $cookies );
my $headers = {Content-type => 'application/json'};
my $client = REST::Client->new( { useragent => $ua });

my $res = $client->POST('https://URL/action/?do=login', 
'{"username": "user@user.com", "password":"password"}', {"Content-type" => 'application/json'});

chkerr($client->responseCode());

print $client->responseContent();
#print $client->responseHeaders();

#$cookies->extract_cookies($res);

print "\n" . $cookies->as_string;

sub chkerr {
    my $res = shift;
    if($res eq '200') {
        print "Success\n";
    } else { print "API Call failed: $res\n";
#exit(1);
}

}

因为我现在尝试了大约50种不同的东西,所以代码非常脏。

输出如下:

Success
true         -> this indicated that login is successful
Set-Cookie3: __cfduid=d3507306fc7b69798730649577c267a2b1369379851; path="/";  domain=.domain.com; path_spec; expires="2019-12-23 23:50:00Z"; version=0

2 个答案:

答案 0 :(得分:4)

documentation开始,REST::Client似乎在内部使用LWP::UserAgent。默认情况下,LWP::UserAgent会忽略Cookie,除非您设置其cookie_jar属性。

所以你可以这样做(未经测试的代码):

my $ua = LWP::UserAgent->new( cookie_jar => {} );
my $rc = REST::Client->new( { useragent => $ua } );

答案 1 :(得分:0)

虽然innaM的答案会起作用,但这对我来说似乎更直接:

$client->getUseragent()->cookie_jar({}); # empty internal cookie jar

这假设您已在REST::Client中拥有$client个对象。