首页  >  文章  >  后端开发  >  无法验证 JWT 令牌

无法验证 JWT 令牌

WBOY
WBOY转载
2024-02-09 08:00:21565浏览

无法验证 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 进行验证

您的 keyfunckeyfunc 返回一个 * edcsa.PrivateKey 与上面的不匹配。要修复此问题,请将 return key, nil 更改为 return &key.PublicKey, nil 返回一个 * edcsa.PrivateKey 与上面的不匹配。要修复此问题,请将 return key, nil 更改为 return &key.PublicKey, nil (playground)。

以上是无法验证 JWT 令牌的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文转载于:stackoverflow.com。如有侵权,请联系admin@php.cn删除