Heim  >  Artikel  >  Backend-Entwicklung  >  Das JWT-Token konnte nicht überprüft werden

Das JWT-Token konnte nicht überprüft werden

WBOY
WBOYnach vorne
2024-02-09 08:00:21513Durchsuche

无法验证 JWT 令牌

php-Editor Xigua stellt Ihnen ein häufiges Problem vor: JWT-Token kann nicht überprüft werden. JWT (JSON Web Token) ist ein offener Standard für Authentifizierung und Autorisierung. Allerdings kann es bei PHP-Anwendungen manchmal zu Problemen kommen, da JWT-Tokens nicht validiert werden können. Dies kann verschiedene Gründe haben, z. B. Schlüsselkonflikt, Token-Ablauf usw. In diesem Artikel werden die möglichen Ursachen dieses Problems ausführlich erläutert und Lösungen bereitgestellt, die Ihnen bei der erfolgreichen Überprüfung von JWT-Tokens helfen.

Frageninhalt

Alles, was ich tun möchte, ist, einen neuen Schlüssel zu generieren, das JWT-Token zu erstellen und es dann zu überprüfen.

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")
    }
}

Ich habe token is invalid: key is of invalid type. Was habe ich falsch gemacht?

Lösung

Laut Dokumentation

Die ECDSA-Signaturmethode (ES256, ES384, ES512) erfordert *ecdsa.PrivateKey zum Signieren und *ecdsa.PublicKey zur Verifizierung

Ihr keyfunckeyfunc 返回一个 * edcsa.PrivateKey 与上面的不匹配。要修复此问题,请将 return key, nil 更改为 return &key.PublicKey, nil gibt einen * edcsa.PrivateKey zurück, der nicht mit dem Obigen übereinstimmt. Um dies zu beheben, ändern Sie return key, nil in return &key.PublicKey, nil (playground).

Das obige ist der detaillierte Inhalt vonDas JWT-Token konnte nicht überprüft werden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen