及时无效的令牌由 JWT 库返回有效

问题描述 投票:0回答:1

在测试服务器时,我注意到过期的令牌继续提供对系统的访问。 我开始检查验证我的令牌的函数。

func (m *Manager) VerifyToken(accessToken string) (int64, error) {
    fmt.Println("\nTOKEN ACCESS: ", accessToken)
    token, err := jwt.Parse(accessToken, func(token *jwt.Token) (interface{}, error) {
        return []byte(m.secretKey), nil
    })
    if err != nil {
        return -1, err
    }
    fmt.Println("TIME NOW: ", time.Now())
    fmt.Println("JWT TOKEN: ", token)
    if !token.Valid {
        return -1, errors.New("invalid token")
    }

该函数收到了一个令牌 - eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHBpcmVzQXQiOjE3MTQ2NTAyMTIsInVzZXJfaWQiOjV9.58N280umsEoi0W9GbIMBbTssKlqpK3by23HTRuWdRyM

使用网站:https://jwt.io/,我在有效负载中收到了它: { “到期时间”:1714650212, “用户 ID”:5 }

Unix 转换时间:Thu May 02 2024 14:43:32 GMT+0300(东欧夏令时间)

当我调用函数时: time.Now() - 2024-05-02 15:18:33.4632351 +0300 EEST m=+7.377764501 您可以看到令牌已过期,但函数 jwt.parse() 返回 Valid = true

结果

我去看了文档,没发现和写的代码有什么区别。 文档:https://pkg.go.dev/github.com/golang-jwt/jwt/v4#Parse 文章:https://medium.com/@cheickzida/golang-implementing-jwt-token-authentication-bba9bfd84d60

go validation time jwt
1个回答
0
投票

您的 JWT 包含:

{
  "expiresAt": 1714650212,
  "user_id": 5
}

虽然

expiresAt
中指定的时间确实已经过去,但这不是 RFC7519 中提到的标头(因此,如果您希望进行验证,则需要自己进行)。

用于“过期时间”的标头是

exp
。因此,具有此标头的令牌将是:

{
  "exp": 1714650212,
  "user_id": 5
}

令牌(使用秘密“秘密密钥”):

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MTQ2NTAyMTIsInVzZXJfaWQiOjV9.Ks3REsNCXL6xj4Iu9gXtGTcqJDV7WQ2TSekEf8jqyA8

通过代码运行此令牌失败,并出现预期错误“令牌具有无效声明:令牌已过期”。

© www.soinside.com 2019 - 2024. All rights reserved.