首頁  >  文章  >  後端開發  >  無法驗證 JWT 令牌

無法驗證 JWT 令牌

WBOY
WBOY轉載
2024-02-09 08:00:21513瀏覽

无法验证 JWT 令牌

php小編西瓜為您介紹一個常見的問題:無法驗證JWT令牌。 JWT(JSON Web Token)是一種用於身份驗證和授權的開放標準。然而,有時在PHP應用程式中,我們可能會遇到無法驗證JWT令牌的問題。這可能是由於多種原因引起的,例如密鑰不匹配、令牌過期等。本文將為您詳細解釋這個問題的可能原因,並提供解決方案,幫助您成功驗證JWT令牌。

問題內容

我想做的就是產生一個新的金鑰,建立 jwt 令牌,然後驗證它。

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

我得到 token is invalid: key is of invalid type。我做錯了什麼?

解決方法

根據 文件

#

ECDSA 簽章方法(ES256、ES384、ES512)需要 *ecdsa.PrivateKey 進行簽名,*ecdsa.PublicKey 進行驗證

您的 keyfunc 傳回一個 * edcsa.PrivateKey 與上面的不符。若要修正此問題,請將 return key, nil 變更為 return &key.PublicKey, nil (playground)。

以上是無法驗證 JWT 令牌的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除