user3906716 user3906716 - 4 months ago 19
Perl Question

Implementing custom Curl authentication in Perl script

I am building bot application trying to use perl script to implement the curl request, the issue I have is with Authorization.

The simple curl command is something like.

curl \
-H 'Authorization: Bearer VM2CKBMXI3AVX2GMYPLBMYFRW3RCHYXS' \
'https://api.wit.ai/message?v=20160722&q='


I preferred not to use system() calls from the Perl script as there will be plenty of back and forth between the user and the bot.

I found this library
http://search.cpan.org/~szbalint/WWW-Curl-4.17/lib/WWW/Curl.pm

I was searching for setopt function in order to find out which params does it accept as my issue is where to put the Authorization param inside the command.
I found this link
http://web.mit.edu/darwin/src/modules/curl/curl/perl/Curl_easy/easy.pm

My Script code for now it is like the following:

use strict;
use warnings;
use WWW::Curl::Easy;

my $curl = WWW::Curl::Easy->new;
my $Authorization="Authorization: Bearer VM2CKBMXI3AVX2GMYPLBMYFRW3RCHYXS";

$curl->setopt(CURLOPT_HEADER,1);
$curl->setopt(CURLOPT_URL, 'https://api.wit.ai/message?v=20160721&q=hello');

# A filehandle, reference to a scalar or reference to a typeglob can be used here.
my $response_body;
$curl->setopt(CURLOPT_WRITEDATA,\$response_body);

# Starts the actual request
my $retcode = $curl->perform;

# Looking at the results...
if ($retcode == 0) {
print("Transfer went ok\n");
my $response_code = $curl->getinfo(CURLINFO_HTTP_CODE);
# judge result and next action based on $response_code
print("Received response: $response_body\n");
} else {
# Error code, type of error, error message
print("An error happened: $retcode ".$curl->strerror($retcode)." ".$curl->errbuf."\n");
}


I just need to know which CURLOPT should I need to use in order to implement authorization.
If you have any idea that will be great.

Thanks
Eran Gross

Answer

If you just want to set the header "Authorization" the option is CURLOPT_HTTPHEADER:

#!/usr/bin/perl
use strict;
use warnings;
use WWW::Curl::Easy;
my $curl = WWW::Curl::Easy->new;
$curl->setopt(CURLOPT_URL, 'http://127.0.0.1/dumprequest.php');
my @headers  = ("Authorization: keygoeshere", "X-Foo: Bah");
$curl->setopt(CURLOPT_HTTPHEADER, \@headers);
$curl->setopt(CURLOPT_HEADER, 1);
my $retcode = $curl->perform;

Gives:

GET dumprequest.php HTTP/1.1
Host: 127.0.0.1
Accept: */*
Authorization: keygoeshere
X-Foo: Bah

But if you actually want to do HTTP authentication then you would use CURLOPT_USERPWD and CURLOPT_HTTPAUTH. See https://curl.haxx.se/libcurl/c/curl_easy_setopt.html for more info on options.

Comments