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

huangapple go评论129阅读模式
英文:

go-jwt token validation error - token signature is invalid: key is of invalid type

问题

获取错误

> 令牌签名无效:密钥类型无效

尝试验证JWT令牌时出现此错误。使用golang-jwt(v5)库。

以下是我生成令牌的方式:

  1. const (
  2. secretKey = "162475e134198bd451af0b88a5defe132c72cb26fd58449772883b90c498b484"
  3. tokenLifespan = 4
  4. )
  5. func GenerateToken() (string, error) {
  6. claims := jwt.MapClaims{}
  7. claims["authorized"] = true
  8. claims["foo"] = "bar"
  9. claims["exp"] = time.Now().Add(time.Hour * time.Duration(tokenLifespan)).Unix()
  10. token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
  11. return token.SignedString([]byte(secretKey))
  12. }

这是生成的令牌:
go-jwt令牌验证错误 – 令牌签名无效:密钥类型无效

这是我验证令牌的方式:

  1. func ValidateToken(c *gin.Context) error {
  2. token, err := GetToken(c)
  3. if err != nil {
  4. return err
  5. }
  6. _, ok := token.Claims.(jwt.MapClaims)
  7. if ok && token.Valid {
  8. return nil
  9. }
  10. return errors.New("invalid token provided")
  11. }
  12. func GetToken(c *gin.Context) (*jwt.Token, error) {
  13. tokenString := getTokenFromRequest(c)
  14. token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
  15. if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
  16. return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
  17. }
  18. return token, nil
  19. })
  20. return token, err
  21. }
  22. func getTokenFromRequest(c *gin.Context) string {
  23. bearerToken := c.Request.Header.Get("Authorization")
  24. splitToken := strings.Split(bearerToken, " ")
  25. if len(splitToken) == 2 {
  26. return splitToken[1]
  27. }
  28. return ""
  29. }

有什么建议可以使其正常工作吗?我漏掉了什么?谢谢。

英文:

Getting an error

> token signature is invalid: key is of invalid type

When trying to validate JWT token. Using golang-jwt (v5) library.

Here is how I'm generating a token:

  1. const (
  2. secretKey = "162475e134198bd451af0b88a5defe132c72cb26fd58449772883b90c498b484"
  3. tokenLifespan = 4
  4. )
  5. func GenerateToken() (string, error) {
  6. claims := jwt.MapClaims{}
  7. claims["authorized"] = true
  8. claims["foo"] = "bar"
  9. claims["exp"] = time.Now().Add(time.Hour * time.Duration(tokenLifespan)).Unix()
  10. token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
  11. return token.SignedString([]byte(secretKey))
  12. }

Here is the generated token:
go-jwt令牌验证错误 – 令牌签名无效:密钥类型无效

And here is how I'm validating the token:

  1. func ValidateToken(c *gin.Context) error {
  2. token, err := GetToken(c)
  3. if err != nil {
  4. return err
  5. }
  6. _, ok := token.Claims.(jwt.MapClaims)
  7. if ok && token.Valid {
  8. return nil
  9. }
  10. return errors.New("invalid token provided")
  11. }
  12. func GetToken(c *gin.Context) (*jwt.Token, error) {
  13. tokenString := getTokenFromRequest(c)
  14. token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
  15. if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
  16. return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
  17. }
  18. return token, nil
  19. })
  20. return token, err
  21. }
  22. func getTokenFromRequest(c *gin.Context) string {
  23. bearerToken := c.Request.Header.Get("Authorization")
  24. splitToken := strings.Split(bearerToken, " ")
  25. if len(splitToken) == 2 {
  26. return splitToken[1]
  27. }
  28. return ""
  29. }

Any suggestions how to get it working? What am I missing? Thanks.

答案1

得分: 1

Keyfunc 是由 Parse 方法使用的回调函数,用于提供用于验证的密钥。因此,它应该返回一个密钥,而不是参数 token *jwt.Token

  1. token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
  2. if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
  3. return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
  4. }
  5. - return token, nil
  6. + return []byte(secretKey), nil
  7. })
英文:

The Keyfunc is used by the Parse methods as a callback function to supply the key for verification. So it should return a key instead of the parameter token *jwt.Token.

  1. token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
  2. if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
  3. return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
  4. }
  5. - return token, nil
  6. + return []byte(secretKey), nil
  7. })

答案2

得分: 1

在函数GetToken()中,jwt.Parse的返回值必须是(tokenString, func(token) (secretKey, error)

所以要修复你的代码,将:

  1. return token, nil

改为

  1. return []byte(secretKey), nil
英文:

In function GetToken(). Return of jwt.Parse must be (tokenString, func(token) (secretKey, error)

So to fix your code, change:

  1. return token, nil

to

  1. return []byte(secretKey), nil

huangapple
  • 本文由 发表于 2023年7月28日 07:40:33
  • 转载请务必保留本文链接:https://go.coder-hub.com/76784035.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定