获取错误

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

try 验证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))
}

Here is the generated token: jwt token decoded

下面是我验证令牌的方法:

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 ""
}

有什么建议可以让它正常工作吗?我遗漏了什么?谢谢.

推荐答案

Parse方法使用Keyfunc作为回调函数来提供用于验证的密钥.因此,它应该返回一个键,而不是参数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相关问答推荐

GoLang:无法发送带有附件的邮箱

如何在GoFr中为生产和本地环境设置不同的配置?

如何将文件从AWS S3存储桶复制到Azure BLOB存储

CURL和Postman HTTP POST工作,但Golang请求失败,状态为400

戈姆:如何将一对一联系起来?

Docker Compose Health Check未退出,错误为无法启动

Date.Format正在输出非常奇怪的日期

Go:拆分一个由逗号分隔的键/值对字符串,并在给定的键/价值对中嵌入可能的逗号

从带有嵌套括号的字符串中提取值

如何将验证器标记添加到嵌套字段

将 firestoreinteger_value转换为整数

加密/椭圆:try 在无效点上进行操作

当图像是对象数组的元素时,如何显示存储为页面资源的图像?

在反向 GORM 中创建查询有一个关系

枚举的 Golang 验证器自定义验证规则

来自洪流公告的奇怪同行字段

如何使用 math/big 对 bigInt 进行取模?

带有 grpc 的 protobuf 用于拆分包中的 Go

如何使用 fyne 避免 GUI 应用程序中的循环依赖?

将函数的值作为输入参数返回给另一个