jsonwebtoken 通过 encode、decode 和 Validation 对象编码和解码 JWT,声明的序列化由 serde 完成。从第 10 版起,密码学运算由通过特性(feature)选择的后端提供——aws_lc_rs 或 rust_crypto——本次检查使用的是 aws_lc_rs。忘记启用该特性不会导致构建失败:只启用默认特性时,11.1.0 能够编译,但在第一次调用 encode() 时 panic,报错 Could not automatically determine the process-level CryptoProvider。应像示例的清单文件那样,恰好启用一个后端。
算法集合是一个封闭枚举:256/384/512 的 HS、RS 和 PS,以及 ES256、ES384 和 EdDSA 的签名与验证均成功,而 ES512、ES256K 和 Ed25519 根本不是枚举变体。也没有 none 变体,因此未签名的令牌在解析头部时就会失败,报错 unknown variant none。Validation::new(alg) 就是允许列表:用 Validation::new(ES256) 检查 HS256 令牌,报错 InvalidAlgorithm;即使两种算法都允许,以 EC 公钥的 PEM 文本为密钥的 HS256 令牌也会报错 InvalidKeyFormat,因为 EC DecodingKey 不能充当 HMAC 密钥。
声明检查比大多数库更严格:不含 exp 的令牌会报错 Missing required claim: exp;默认容差为 60 秒——57 秒前过期的令牌仍然验证通过。应像示例那样调小 leeway,并在 Validation 上设置颁发者和受众。ES256 在签名时会拒绝 P-384 密钥,报错 InvalidEcdsaKey。
ES256 签名是 JWS 要求的 64 字节原始 r‖s,DER 签名会报错 InvalidSignature。密钥可以从 PEM(from_ec_pem、from_rsa_pem、from_ed_pem)和 DER 加载;对于 Ed25519 的 DER,编码密钥接收 PKCS#8,解码密钥接收 32 字节的原始公钥。可以用 JWT 调试器检查令牌,用 JWT 密钥检测工具测试 HMAC 密钥。
JWT 以外的签名,可以直接使用后端 crate:aws-lc-rs 或 RustCrypto ecdsa。