our
$VERSION
=
'0.003'
;
my
$providers
= Enum(
[
qw(
google_v1
google_v2
azure_v1
azure_v2
)
]
);
my
%providers
= (
);
has
provider
=> (
is
=>
'ro'
,
isa
=>
$providers
,
predicate
=>
'has_provider'
,
);
sub
usage_pod { 1 }
sub
cli_options {
return
(
'jwt=s'
,
'provider=s'
,
'key_uri=s'
,
'tenant_id|tenant-id=s'
,
'ignore_signature|ignore-signature'
);
}
sub
_croak {
my
$self
=
shift
;
my
$msg
=
shift
;
return
$self
->as_help(1,
$msg
)->run;
}
sub
action {
'main'
}
sub
run {
my
$self
=
shift
;
my
$token
=
$self
->_cli_args->{jwt};
$self
->_croak(
"You must supply a JWT token"
)
unless
defined
$token
;
my
$uri
=
$self
->_cli_args->{key_uri};
my
$keys
;
if
(!
$self
->_cli_args->{ignore_signature}) {
if
(
$self
->has_provider) {
$uri
=
$providers
{
$self
->provider};
if
(any {
$self
->provider eq
$_
}
qw(azure_v1 azure_v2)
) {
my
$tenant_id
=
$self
->_cli_args->{tenant_id};
$self
->_croak(
"You must supply a tenant-id"
)
unless
$tenant_id
;
$uri
=~ s/tenantid/
$tenant_id
/;
}
}
$self
->_croak(
"You must supply a provider or URI"
)
unless
defined
$uri
;
my
$ua
= LWP::UserAgent->new();
$ua
->default_header(
'Accept'
=>
'application/json'
);
$ua
->default_header(
'Accept'
=>
'application/foo'
);
my
$res
=
$ua
->get(
$uri
);
die
(
"Unable to get $uri: "
.
$res
->status_line . $/)
unless
$res
->is_success;
$keys
= JSON::XS::decode_json(
$res
->decoded_content);
}
my
$data
= decode_jwt(
token
=>
$token
,
$self
->_cli_args->{ignore_signature} ? (
ignore_signature
=> 1 ) : (
kid_keys
=>
$keys
,
),
verify_exp
=> 0,
);
say
"Decrypted token to:\n"
. Dumper
$data
;
}
__PACKAGE__->meta->make_immutable;