Maison > Java > Pris dans une erreur. La validité de JWT ne peut pas être affirmée et ne doit pas être fiable

Pris dans une erreur. La validité de JWT ne peut pas être affirmée et ne doit pas être fiable

王林
Libérer: 2024-02-15 09:18:07
avant
1204 Les gens l'ont consulté

L'éditeur php Banana a souligné que lors de l'utilisation de JWT (JSON Web Tokens), vous devez noter que sa validité ne peut pas être affirmée et ne doit pas être fiable. JWT est un jeton utilisé pour l'authentification et l'autorisation, mais en raison de sa nature autonome, une fois le jeton falsifié, sa validité ne peut être garantie. Par conséquent, lors de l'utilisation de JWT, nous devons prendre des mesures de vérification strictes, notamment la vérification des signatures, du délai d'expiration, etc., et ne pas stocker d'informations sensibles dans JWT pour éviter les risques de sécurité.

Contenu de la question

Mon code jwtutil.java :

@service
@requiredargsconstructor
public class jwtutil {



    private secretkey getsigningkey() {
        return jwts.sig.hs512.key().build();
    }

    public string generatetoken(securitymember securitymember) {
        map<string, object> claims = new hashmap<>();
        return createtoken(claims, securitymember.getusername());
    }

    public string createtoken(map<string, object> claims, string subject) {
        return jwts.builder().claims(claims).subject(subject).issuedat(new date(system.currenttimemillis()))
                .expiration(new date(system.currenttimemillis() + 1000 * 60 * 60 * 10))
                .signwith(getsigningkey())
                .compact();
    }

    public boolean validatetoken(string token, securitymember securitymember) {
        final string username = extractusername(token);
        return (username.equals(securitymember.getusername()) && !istokenexpired(token));
    }

    private boolean istokenexpired(string token) {
        return extractexpiration(token).before(new date(system.currenttimemillis()));
    }

    public date extractexpiration(string token) {
        return extractclaims(token,claims::getexpiration);
    }

    public
    string extractusername(string token) {
        return extractclaims(token,claims::getsubject);
    }


    private <t> t extractclaims(string token, function<claims, t> claimsresolver) {
        final jwe<claims> claims = extractallclaims(token);
        return claimsresolver.apply(claims.getpayload());
    }

    private jwe<claims> extractallclaims(string token) {
        try {
            return jwts.parser()
                            .requireissuer("http://localhost:8080")
                            .verifywith(getsigningkey())
                            .build()
                            .parse(token).accept(jwe.claims);
        } catch (jwtexception ex) {
            throw new jwtexception("wrong jwt"+ex.getmessage(),ex);
        }


    }
}
Copier après la connexion

La question est :

Caused by: io.jsonwebtoken.security.SignatureException: JWT signature does not match locally computed signature. JWT validity cannot be asserted and should not be trusted.
Copier après la connexion

Workaround

Votre fonction getsigningkey() 使用 jwts.sig.hs512.key().build();, qui créera une nouvelle clé à chaque fois que vous l'appellerez.

Mais vous appelez getsigningkey() lorsque vous signez le token et lorsque vous vérifiez le token, vous avez donc des clés différentes dans les deux cas.

Créez plutôt une clé, stockez-la et utilisez la clé stockée. Par exemple :

signingKey = getSigningKey();

// use it for signing
Jwts.builder().signWith(signingKey)...

// and verification
Jwts.parser().verifyWith(signingKey)...
Copier après la connexion

Mais la création de la clé ne doit pas avoir lieu à chaque fois qu'un jeton est créé, mais doit en être distincte. Vous devez également envisager de conserver la clé afin de conserver la même clé après le redémarrage du programme. Sinon, tous les jetons émis deviendront invalides après le redémarrage.

La vérification signifie que vous vérifiez la signature du jeton par rapport à la même clé utilisée pour la signer.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal