Rumah  >  Artikel  >  pembangunan bahagian belakang  >  ralat pengesahan token go-jwt - tandatangan token tidak sah: Jenis kunci tidak sah

ralat pengesahan token go-jwt - tandatangan token tidak sah: Jenis kunci tidak sah

王林
王林ke hadapan
2024-02-08 21:15:31429semak imbas

go-jwt 令牌验证错误 - 令牌签名无效:密钥类型无效

Editor PHP Zimo mungkin menghadapi mesej ralat: "Tandatangan token tidak sah: Jenis kunci tidak sah" apabila menggunakan go-jwt untuk pengesahan token. Ralat ini disebabkan oleh ketidakpadanan antara tandatangan token dan jenis kunci. Tandatangan token ialah bahagian penting dalam mengesahkan token, dan jenis kunci menentukan algoritma yang digunakan untuk menjana dan mengesahkan tandatangan. Untuk menyelesaikan masalah ini, kita perlu memastikan bahawa algoritma tandatangan token adalah konsisten dengan jenis kunci. Seterusnya, kami akan memperincikan cara mengkonfigurasi dan menggunakan go-jwt dengan betul untuk mengelakkan ralat ini.

Kandungan soalan

Ralat berlaku

token signature is invalid: key is of invalid type

Apabila cuba mengesahkan token jwt. Gunakan perpustakaan golang-jwt (v5).

Begini cara saya menjana token:

const (
    secretkey     = "162475e134198bd451af0b88a5defe132c72cb26fd58449772883b90c498b484"
    tokenlifespan = 4
)

func generatetoken() (string, error) {
    claims := jwt.mapclaims{}
    claims["authorized"] = true
    claims["foo"] = "bar"
    claims["exp"] = time.now().add(time.hour * time.duration(tokenlifespan)).unix()
    token := jwt.newwithclaims(jwt.signingmethodhs256, claims)

    return token.signedstring([]byte(secretkey))
}

Ini adalah token yang dihasilkan:

Ini adalah cara saya mengesahkan token:

func ValidateToken(c *gin.Context) error {
    token, err := GetToken(c)

    if err != nil {
        return err
    }

    _, ok := token.Claims.(jwt.MapClaims)
    if ok && token.Valid {
        return nil
    }

    return errors.New("invalid token provided")
}

func GetToken(c *gin.Context) (*jwt.Token, error) {
    tokenString := getTokenFromRequest(c)
    token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
        if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
            return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
        }

        return token, nil
    })
    return token, err
}

func getTokenFromRequest(c *gin.Context) string {
    bearerToken := c.Request.Header.Get("Authorization")

    splitToken := strings.Split(bearerToken, " ")
    if len(splitToken) == 2 {
        return splitToken[1]
    }
    return ""
}

Ada cadangan bagaimana untuk menjadikannya berfungsi? Apa yang saya hilang? Terima kasih.

Penyelesaian

keyfunc Gunakan kaedah dengan menghuraikan sebagai fungsi panggil balik untuk menyediakan kunci pengesahan. Jadi ia harus mengembalikan kunci dan bukannya parameter token *jwt.token.

token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
    if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
        return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
    }

-   return token, nil
+   return []byte(secretKey), nil
  })

Atas ialah kandungan terperinci ralat pengesahan token go-jwt - tandatangan token tidak sah: Jenis kunci tidak sah. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam