Maison  >  Article  >  développement back-end  >  Impossible de vérifier le jeton JWT

Impossible de vérifier le jeton JWT

WBOY
WBOYavant
2024-02-09 08:00:21567parcourir

无法验证 JWT 令牌

L'éditeur php Xigua vous présente un problème courant : impossible de vérifier le jeton JWT. JWT (JSON Web Token) est un standard ouvert d'authentification et d'autorisation. Cependant, parfois dans les applications PHP, nous pouvons rencontrer des problèmes liés à l'impossibilité de valider les jetons JWT. Cela peut être dû à un certain nombre de raisons, telles qu'une incompatibilité de clé, l'expiration du jeton, etc. Cet article expliquera en détail les causes possibles de ce problème et fournira des solutions pour vous aider à vérifier avec succès les jetons JWT.

Contenu de la question

Tout ce que je veux faire est de générer une nouvelle clé, de créer le jeton jwt, puis de le vérifier.

package main

import (
    "crypto/ecdsa"
    "crypto/elliptic"
    "crypto/rand"
    "crypto/x509"
    "encoding/base64"
    "fmt"
    "log"
    "time"

    "github.com/golang-jwt/jwt/v4"
)

func main() {
    key, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
    if err != nil {
        log.Fatalln(err)
        return
    }

    privateK, err := x509.MarshalECPrivateKey(key)
    if err != nil {
        log.Fatalln(err)
        return
    }

    claims := jwt.MapClaims{}
    claims["authorized"] = true
    claims["user_id"] = 10
    claims["exp"] = time.Now().Add(time.Hour * time.Duration(1)).Unix()
    t := jwt.NewWithClaims(jwt.SigningMethodES256, claims)

    tokenStr, err := t.SignedString(key)
    if err != nil {
        log.Fatalln(err)
        return
    }

    fmt.Printf("Secret: %s\n", base64.StdEncoding.EncodeToString(privateK))
    fmt.Printf("Token: %s\n", tokenStr)

    // Validate token

    _, err = jwt.Parse(tokenStr, func(token *jwt.Token) (interface{}, error) {
        if _, ok := token.Method.(*jwt.SigningMethodECDSA); !ok {
            return nil, fmt.Errorf("unexpected signing method %v", token.Header["alg"])
        }
        return key, nil
    })

    if err != nil {
        log.Fatalf("Token is invalid %v", err)
    } else {
        fmt.Println("Token is valid")
    }
}

J'ai eu token is invalid: key is of invalid type. Qu'ai-je fait de mal?

Solution

Selon Documentation

La méthode de signature ECDSA (ES256, ES384, ES512) nécessite *ecdsa.PrivateKey pour la signature et *ecdsa.PublicKey pour la vérification

Votre keyfunckeyfunc 返回一个 * edcsa.PrivateKey 与上面的不匹配。要修复此问题,请将 return key, nil 更改为 return &key.PublicKey, nil renvoie un * edcsa.PrivateKey qui ne correspond pas à ce qui précède. Pour résoudre ce problème, remplacez return key, nil par return &key.PublicKey, nil (playground).

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer