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.
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.
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!