You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 22:20:41