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

王林
Lepaskan: 2024-02-08 21:15:31
ke hadapan
435 orang telah melayarinya

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
Salin selepas log masuk

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))
}
Salin selepas log masuk

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 ""
}
Salin selepas log masuk

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
  })
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan