ruby-jwt (Ruby)Ruby
エラーメッセージ
Expected a different algorithm (JWT::IncorrectAlgorithm)
別の表記
- JWT::IncorrectAlgorithm: Expected a different algorithm
ruby-jwt (Ruby) — JWT::IncorrectAlgorithm from JWT.decode
このエラーの意味
トークンの `alg` ヘッダーが、許可したアルゴリズムに含まれていません。また、`algorithm:`/`algorithms:` オプションをまったく渡していない場合、ruby-jwt はどのアルゴリズムも許可しません。ruby-jwt 2.x 以降、検証者はアルゴリズムを明示的に指定しなければなりません。トークン自身のヘッダーを信頼することが、よく知られたアルゴリズム混同攻撃の根本原因だからです。署名はチェックされていません。
発生する理由
JWT.decode にアルゴリズムを渡していない
よくあるruby-jwt 1.x のチュートリアルのコードは `JWT.decode(token, key, true)` を呼び出しています。現在のバージョンでは、この場合すべてのトークンがこのエラーで拒否されます。
発行者が、設定とは異なるアルゴリズムを使っている
よくある発行者側で RS256 から ES256 へ(または HS256 から非対称アルゴリズムへ)移行すると、古い値に固定したままの検証者は動作しなくなります。
別の発行者のトークン、またはプローブ
ときどきRS256/ES256 で検証する API に送られた `alg: none` や `HS256` のトークンは、ここで拒否されます。これは正しい動作です。
修正方法
- 1.
発行者のアルゴリズムを明示的に指定する
`algorithm:`(短いリストの場合は `algorithms:`)を渡してください。複数のアルゴリズムを使う場合は JWKS ローダーを使い、各トークンが種類の一致する鍵で検証されるようにしてください。
ruby payload, header = JWT.decode(token, public_key, true, algorithm: "ES256") # several allowed algorithms (e.g. during a migration), each matched to the right key type: payload, header = JWT.decode(token, nil, true, algorithms: ["ES256", "RS256"], jwks: jwks_loader)