Perl使用Crypt::JWT无法捕获JWT无效签名错误的问题求助
解决Perl Crypt::JWT无法捕获签名验证失败的问题
核心原因
Crypt::JWT的decode_jwt函数默认在签名验证失败时直接终止程序(die),而非返回错误状态,导致常规的空值判断、or die()无法生效;Perl本身也没有原生的try/catch语法,直接写try{}catch{}不会起作用。
有效解决方案
方法1:用ignore_error参数让验证失败返回undef
给decode_jwt添加ignore_error => 1参数,验证失败时会返回undef,同时错误信息会存入$Crypt::JWT::errstr变量,方便后续处理:
# 解码部分修改为: my $data = decode_jwt( token => $token, key => $pubkey, ignore_error => 1 # 关键参数 ); if ( !$data ) { print "验证失败: $Crypt::JWT::errstr\n\n"; } else { print "验证成功\n\n"; }
方法2:用eval块捕获异常
如果不想修改decode_jwt的默认行为,可以用Perl原生的eval块捕获die抛出的异常:
# 解码部分修改为: my $data; eval { $data = decode_jwt(token => $token, key => $pubkey); }; if ($@) { print "验证失败: $@\n\n"; } else { print "验证成功\n\n"; }
$@变量会保存eval块中触发的异常信息,以此实现错误捕获。
方法3:用Try::Tiny实现try/catch语法
如果习惯用try/catch风格,先安装Try::Tiny模块:
cpan Try::Tiny
然后修改代码:
use Try::Tiny; # 开头添加模块引入 # 解码部分修改为: my $data; try { $data = decode_jwt(token => $token, key => $pubkey); } catch { print "验证失败: $_\n\n"; }; if ($data) { print "验证成功\n\n"; }
修改后的完整测试代码(以方法1为例)
#!/usr/bin/perl use strict; use warnings; use Crypt::JWT qw(encode_jwt decode_jwt); use Crypt::PK::RSA; use Data::Dumper; ######################## # Encode (Create signature) ######################## my $payload = { iss => "issuer", sub => "subject", exp => time + 86400, }; my $keyfile = "/root/ssl/jwtRS256.key"; my $keyfile2 = "/root/ssl/jwtRS256-2.key"; my $key = Crypt::PK::RSA->new($keyfile2); my $alg = "RS256"; my $token = encode_jwt(payload => $payload, key => $key, alg => $alg); print "token: $token\n\n\n"; ######################## # Decode (Verify signature) ######################## my $pubkeyfile = "/root/ssl/jwtRS256.key.pub"; my $pubkeyfile2 = "/root/ssl/jwtRS256-2.key.pub"; my $pubkey = Crypt::PK::RSA->new($pubkeyfile); my $data = decode_jwt( token => $token, key => $pubkey, ignore_error => 1 ); if ( !$data ) { print "验证失败: $Crypt::JWT::errstr\n\n"; } else { print "验证成功\n\n"; } print Dumper \$data;
内容的提问来源于stack exchange,提问作者JerseyDevel
相关产品推荐
相关产品推荐

