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 を検証できません)。このチェックは、署名の検証より前に行われます。最もよくある原因は、HS256 しか許可しない `Validation::default()` です。
発生する理由
非対称アルゴリズムのトークンに Validation::default() を使っている
よくある`Validation::default()` は `Validation::new(Algorithm::HS256)` と同じです。ID プロバイダーのトークンは通常 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)?;