[pve-devel] [PATCH apiclient] implement api token support

Fabian Grünbichler f.gruenbichler at proxmox.com
Thu Jan 30 12:07:52 CET 2020


and add an example for it.

Signed-off-by: Fabian Grünbichler <f.gruenbichler at proxmox.com>
---
 PVE/APIClient/LWP.pm | 22 ++++++++++++++++++++--
 examples/example3.pl | 24 ++++++++++++++++++++++++
 2 files changed, 44 insertions(+), 2 deletions(-)
 create mode 100755 examples/example3.pl

diff --git a/PVE/APIClient/LWP.pm b/PVE/APIClient/LWP.pm
index 97fd64f..c18210d 100755
--- a/PVE/APIClient/LWP.pm
+++ b/PVE/APIClient/LWP.pm
@@ -192,12 +192,13 @@ sub call {
     delete $self->{last_unknown_fingerprint};
 
     my $ticket = $self->{ticket};
+    my $apitoken = $self->{apitoken};
 
     my $ua = $self->{useragent};
 
     # fixme: check ticket lifetime?
 
-    if (!$ticket && $self->{username} && $self->{password}) {
+    if (!$ticket && !$apitoken && $self->{username} && $self->{password}) {
 	$self->login();
     }
 
@@ -346,9 +347,26 @@ sub new {
 
     $self->{useragent}->default_header('Accept-Encoding' => 'gzip'); # allow gzip
 
-    $self->update_ticket($param{ticket}) if $param{ticket};
+    if ($param{apitoken} && $param{password}) {
+	warn "password will be ignored in favor of API token\n";
+	delete $self->{password};
+    }
+    if ($param{ticket}) {
+	if ($param{apitoken}) {
+	    warn "ticket will be ignored in favor of API token\n";
+	} else {
+	    $self->update_ticket($param{ticket});
+	}
+    }
     $self->update_csrftoken($param{csrftoken}) if $param{csrftoken};
 
+    if ($param{apitoken}) {
+	my $agent = $self->{useragent};
+
+	$self->{apitoken} = $param{apitoken};
+
+	$agent->default_header('Authorization', $param{apitoken});
+    }
 
     return $self;
 }
diff --git a/examples/example3.pl b/examples/example3.pl
new file mode 100755
index 0000000..d09e052
--- /dev/null
+++ b/examples/example3.pl
@@ -0,0 +1,24 @@
+#!/usr/bin/perl
+
+# NOTE: you need to set the API token and PVE host below for this to work
+
+use strict;
+use warnings;
+
+use PVE::APIClient::LWP;
+
+use JSON;
+
+my $apitoken = 'PVEAPIToken=USER at REALM!TOKENID=TOKENVALUE';
+my $hostname = "127.0.0.1";
+
+my $conn = PVE::APIClient::LWP->new(
+    apitoken => $apitoken,
+    host => $hostname,
+    # allow manual fingerprint verification
+    manual_verification => 1,
+    );
+
+my $res = $conn->get("/access/permissions", {});
+
+print to_json($res, { pretty => 1, canonical => 1});
-- 
2.20.1





More information about the pve-devel mailing list