Сообщение об ошибке
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) ломает проверяющие стороны, в которых жёстко задан старый алгоритм.
Ключ и алгоритм из разных семейств
иногдаУказать и RS256, и ES256 не поможет, если `DecodingKey` — ключ RSA, а токен подписан 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)?;