php小编子墨在使用go-jwt进行令牌验证时,可能会遇到错误信息:"令牌签名无效:密钥类型无效"。这个错误是由于令牌的签名与密钥类型不匹配所引起的。令牌签名是验证令牌的重要组成部分,密钥类型则指定了用于生成和验证签名的算法。要解决这个问题,我们需要确保令牌的签名算法与密钥类型一致。接下来,我们将详细介绍如何正确配置和使用go-jwt来避免这个错误。
问题内容
出现错误
token signature is invalid: key is of invalid type
尝试验证 jwt 令牌时。使用 golang-jwt (v5) 库。
以下是我生成令牌的方法:
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))
}
这是生成的令牌:
这是我验证令牌的方式:
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 ""
}
有什么建议如何让它工作吗?我缺少什么?谢谢。
解决方法
keyfunc 由 parse 使用方法作为回调函数来提供验证密钥。所以它应该返回一个密钥而不是参数 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
})
以上就是go-jwt 令牌验证错误 - 令牌签名无效:密钥类型无效的详细内容,更多请关注编程网其它相关文章!