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
keyfunc
返回一个 * edcsa.PrivateKey
与上面的不匹配。要修复此问题,请将 return key, nil
更改为 return &key.PublicKey, nil
返回一个 * edcsa.PrivateKey
与上面的不匹配。要修复此问题,请将 return key, nil
更改为 return &key.PublicKey, nil
(playground)。
以上是无法验证 JWT 令牌的详细内容。更多信息请关注PHP中文网其他相关文章!