Dancer2-Plugin-JWT
view release on metacpan or search on metacpan
lib/Dancer2/Plugin/JWT.pm view on Meta::CPAN
? $config->{expose_authorization_header} : $DEFAULT_EXPOSE_AUTHORIZATION_HEADER;
$set_cookie_header = defined $config->{set_cookie_header}
? $config->{set_cookie_header} : $DEFAULT_SET_COOKIE_HEADER;
$set_location_header = defined $config->{set_location_header}
? $config->{set_location_header} : $DEFAULT_SET_LOCATION_HEADER;
$alg = 'HS256';
if ( exists $config->{alg} && defined $config->{alg} ) {
my $need_enc = undef;
my $need_key = undef;
if ( $config->{alg} =~ /^([EHPR])S(256|384|512)$/ ) {
my $type = $1;
if ( $type eq 'P' || $type eq 'R' ) {
$need_key = 1;
} elsif ( $type eq 'E' ) {
$need_key = 2;
}
$alg = $config->{alg};
} elsif ( $config->{alg} =~ /^A(128|192|256)(GCM)?KW$/ ) {
my $len = $1;
if ( ( length( unpack( 'H*', $secret ) ) * 4 ) != $len ) {
die 'Secret key length must be equal ' . ($len / 8) . ' bytes for selected algoritm';
}
$alg = $config->{alg};
$need_enc = 1;
} elsif ( $config->{alg} =~ /^PBES2-HS(256|384|512)\+A(128|192|256)KW$/ ) {
my $hs = $1;
my $a = $2;
if ( ( ( $a * 2 ) - $hs ) != 0 ) {
die 'Incompatible A and HS values';
}
$alg = $config->{alg};
$need_enc = 1;
} elsif ( $config->{alg} =~ /^RSA((-OAEP(-265)?)|1_5)$/ ) {
$alg = $config->{alg};
$need_enc = 1;
$need_key = 1;
} elsif ( $config->{alg} =~ /^ECDH-ES(\+A(128|192|256)KW)?$/ ) {
$alg = $config->{alg};
$need_enc = 1;
$need_key = 2;
} else {
die 'Unknown algoritm';
}
if ( $need_enc ) {
unless ( exists $config->{enc} && defined $config->{enc} ) {
die 'JWE cannot be used with empty encryption method';
}
if ( $config->{enc} =~ /^A(128|192|256)GCM$/ ) {
$enc = $config->{enc};
} elsif ( $config->{enc} =~ /^A(128|192|256)CBC-HS(256|384|512)$/ ) {
my $a = $1;
my $hs = $2;
if ( ( ( $a * 2 ) - $hs ) != 0 ) {
die 'Incompatible A and HS values';
}
$enc = $config->{enc};
}
}
if ( defined $need_key ) {
if ( $need_key == 1 ) {
# TODO: add code to handle RSA keys or parse JWK hash string:
##instance of Crypt::PK::RSA
#my $data = decode_jwt(token=>$t, key=>Crypt::PK::RSA->new('keyfile.pem'));
#
##instance of Crypt::X509 (public key only)
#my $data = decode_jwt(token=>$t, key=>Crypt::X509->new(cert=>$cert));
#
##instance of Crypt::OpenSSL::X509 (public key only)
#my $data = decode_jwt(token=>$t, key=>Crypt::OpenSSL::X509->new_from_file('cert.pem'));
} elsif ( $need_key == 2 ) {
# TODO: add code to handle ECC keys or parse JWK hash string:
#instance of Crypt::PK::ECC
#my $data = decode_jwt(token=>$t, key=>Crypt::PK::ECC->new('keyfile.pem'));
}
}
}
if ( exists $config->{need_iat} && defined $config->{need_iat} ) {
$need_iat = $config->{need_iat};
}
if ( exists $config->{need_nbf} && defined $config->{need_nbf} ) {
$need_nbf = $config->{need_nbf};
}
if ( exists $config->{need_exp} && defined $config->{need_exp} ) {
$need_exp = $config->{need_exp};
}
if ( exists $config->{need_leeway} && defined $config->{need_leeway} ) {
$need_leeway = $config->{need_leeway};
}
$dsl->app->add_hook(
Dancer2::Core::Hook->new(
name => 'before_template_render',
code => sub {
my $tokens = shift;
$tokens->{jwt} = $dsl->app->request->var('jwt');
}
)
);
$dsl->app->add_hook(
Dancer2::Core::Hook->new(
name => 'after',
code => sub {
( run in 1.559 second using v1.01-cache-2.11-cpan-e1769b4cff6 )