Aller au contenu
ecdsa.com
jsonwebtoken (Rust crate)Rust

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

Comment corriger l’erreur

  1. 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. 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)?;

Erreurs associées

Parcourir toute la base de données des erreurs de signature