lcobucci/jwt 把解析、签名和校验分开:Configuration 保存签名器和密钥,parser()->parse() 读取令牌但不做任何检查,validator()->assert() 应用你传入的约束。不带约束调用 assert() 会抛出 NoConstraintsGiven,因此很难无意中写出什么都不检查的校验。
SignedWith 锁定签名器和密钥:一个 RS256 令牌和一个用 EC 密钥的 PEM 文本伪造的 HS256 令牌,都报错 Token signer mismatch。未签名的令牌甚至无法解析(The JWT string is missing the Signature part)。密钥长度在签名时就会被强制检查——ES256 拒绝了 P-384 密钥(The length of the provided key is different than 256 bits),HS256 拒绝了 40 位的密钥——因此根本不会生成不合规的令牌。
时间检查也是约束,因此只有列出时才会执行:一个一小时前就已过期的令牌,只用 SignedWith 检查时照样通过。LooseValidAt 会在 exp、nbf 和 iat 存在时检查它们,并接受了不含 exp 的令牌;StrictValidAt 要求三者都存在——不含 iat 的令牌报错 "Issued At" claim missing,含 iat 和 exp 但没有 nbf 的令牌报错 "Not Before" claim missing。两者都接受可选的容差时间间隔,默认为零。示例设置了全部三个声明,并在一次调用中断言签名、颁发者和严格有效性。
5.6.1 支持 256/384/512 的 HS、RS、ES 以及 EdDSA;没有 PS* 签名器,也没有 ES256K,因此颁发者使用 RSA-PSS 的令牌需要用 web-token 处理。ES256 签名是 64 字节的原始 r‖s,DER 签名会报错 Token signature mismatch;JWT 调试器能显示令牌使用的是哪种编码。