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中文網其他相關文章!