Message d’erreur
Error(InvalidSignature)
Également affiché sous la forme
- called `Result::unwrap()` on an `Err` value: Error(InvalidSignature)
- InvalidSignature
`{:?}` affiche `Error(InvalidSignature)`, `{}` affiche `InvalidSignature` ; `.unwrap()` panique avec « called `Result::unwrap()` on an `Err` value: Error(InvalidSignature) ».
jsonwebtoken (Rust crate) — ErrorKind::InvalidSignature from decode()
Ce que cela signifie
La crate `jsonwebtoken` a analysé le jeton et accepté son algorithme, mais la signature n’a pas pu être vérifiée avec la `DecodingKey` que vous avez passée. `Error(InvalidSignature)` est la forme `Debug` que l’on voit dans les journaux et les paniques de `unwrap()` ; la forme `Display` est simplement `InvalidSignature`. La crate ne distingue pas « mauvaise clé » de « jeton modifié » : dans les deux cas, la signature n’est pas valide pour cette clé.
Pourquoi cela se produit
La DecodingKey n’appartient pas au signataire
fréquenteUne clé d’un autre environnement, une clé codée en dur alors que l’émetteur a effectué une rotation, ou une JWK choisie par sa position au lieu de son `kid`.
La signature ECDSA du jeton est encodée en DER
occasionnelleUn jeton construit à la main avec une signature produite par un KMS ou par OpenSSL contient du DER (~71 octets) au lieu des 64 octets r‖s qu’exige ES256 ; sa vérification échoue toujours.
Les octets du secret HS256 diffèrent
occasionnelle`DecodingKey::from_secret(b"...")` d’un côté et `from_base64_secret("...")` de l’autre produisent des clés différentes à partir de la même chaîne de configuration.
Comment corriger l’erreur
- 1.
Traiter explicitement le type d’erreur
Faites correspondre `ErrorKind::InvalidSignature` au code 401 et distinguez ce cas de l’expiration, pour que les clients ne réessaient pas avec un jeton qui ne pourra jamais être accepté.
rust use jsonwebtoken::errors::ErrorKind; match decode::<Claims>(&token, &key, &validation) { Ok(data) => Ok(data.claims), Err(e) => match e.kind() { ErrorKind::InvalidSignature => Err(AuthError::Unauthorized), // wrong key or tampered token ErrorKind::ExpiredSignature => Err(AuthError::Expired), _ => Err(AuthError::BadToken), }, } - 2.
Sélectionner la clé par kid dans le JWKS de l’émetteur
`JwkSet::find` et `DecodingKey::from_jwk` choisissent exactement la clé que l’émetteur désigne dans l’en-tête.
rust use jsonwebtoken::{decode_header, jwk::JwkSet, DecodingKey}; let header = decode_header(&token)?; let kid = header.kid.ok_or(AuthError::BadToken)?; let jwk = jwks.find(&kid).ok_or(AuthError::UnknownKey)?; // jwks: JwkSet fetched from the issuer let key = DecodingKey::from_jwk(jwk)?;