【问题标题】:Perl REST::Client best way to get and use CSRFToken and session id through cookiesPerl REST::Client 通过 cookie 获取和使用 CSRFToken 和会话 id 的最佳方式
【发布时间】:2013-05-23 12:45:30
【问题描述】:

所以现在我正在使用 REST::Client,它在发出 GET 请求和获取 JSON 数据方面做得非常好。但是,有问题的 API 在发出 POST 请求时应传递 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

【问题讨论】:

    标签: perl rest cookies csrf lwp


    【解决方案1】:

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

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

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

    【讨论】:

    • 好东西,这就是我想要的。但是,我怀疑我设置它的方式只是获取初始 cookie: my $ua = LWP::UserAgent->new( cookie_jar => $cookies );而不是 POST 请求后的 cookie,所以我没有得到 CSRF 令牌。我应该如何去做,我应该如何在 POST 请求之后获取 cookie,因为现在我得到的只是常规的跟踪 cookie。谢谢
    • 另外一件奇怪的事情是我得到的cookie被标记为Set-Cookie3,那不是说之前还有几个吗?我虽然 cookie jar 是一个标量,而不是一个数组?
    • 请阅读(文档)[search.cpan.org/~gaas/HTTP-Cookies-6.01/lib/HTTP/Cookies.pm](搜索“cookie3”)。你设置它的方式应该是正确的。你正在使用一个饼干罐。与现实世界不同,当你使用 jar 时,会有 cookie 进入它。
    • 好的,所以当我发出这样的 curl 请求时 curl -X POST URL/action/?do=login --data '{"username":"user@user.com","password":"pass" }' -c cook -H "Content-Type:application/json" 我在文件中有所有正确的 cookie,但是在运行 perl 脚本时我没有得到所有的 cookie。实际上,经过身份验证后我没有得到那些,有什么想法吗?
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      • 2020-06-03
      • 2023-04-04
      • 2012-08-18
      • 1970-01-01
      相关资源
      最近更新 更多