jsonwebtoken (Rust crate)Rust
错误信息
Error(InvalidAlgorithm)
也可能输出为
- called `Result::unwrap()` on an `Err` value: Error(InvalidAlgorithm)
- InvalidAlgorithm
`{:?}` 打印 `Error(InvalidAlgorithm)`,`{}` 打印 `InvalidAlgorithm`。
jsonwebtoken (Rust crate) — ErrorKind::InvalidAlgorithm from decode()
含义
令牌的 `alg` 不在 `validation.algorithms` 中,或者与 `DecodingKey` 所属的算法族不符(EC 密钥无法验证 RS256)。这项检查发生在任何签名验证之前。最常见的诱因是 `Validation::default()`,它只允许 HS256。
原因
对非对称令牌使用 Validation::default()
常见`Validation::default()` 等同于 `Validation::new(Algorithm::HS256)`。身份提供商签发的令牌通常是 RS256 或 ES256,会立即验证失败。
颁发者更换了算法
偶见提供商迁移算法(例如 RS256 → ES256)后,固定使用旧算法的验证方就会验证失败。
密钥与算法属于不同的算法族
偶见如果 `DecodingKey` 是 RSA 密钥而令牌是 ES256,那么同时列出 RS256 和 ES256 也无济于事:密钥所属的算法族必须与令牌的算法一致。
修复方法
- 1.
按颁发者的算法构建 Validation
用颁发者的算法调用 `Validation::new`,同时设置期望的颁发者和受众——默认设置不会检查它们。
rust let mut validation = Validation::new(Algorithm::ES256); // the issuer's algorithm validation.set_issuer(&["https://issuer.example.com/"]); validation.set_audience(&["api://orders"]); let data = decode::<Claims>(&token, &key, &validation)?;