Maison > développement back-end > Golang > le corps du texte

Impossible de vérifier le jeton JWT

WBOY
Libérer: 2024-02-09 08:00:21
avant
571 Les gens l'ont consulté

无法验证 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")
    }
}
Copier après la connexion

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!

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