【问题标题】:How to check for JWT token remaining validity time golang如何检查JWT令牌剩余有效时间golang
【发布时间】:2016-12-31 09:19:09
【问题描述】:

我正在使用

设置 JWT 令牌声明的过期时间
claims["exp"] = time.Now().Add(time.Hour * time.Duration(settings.Get().JWTExpiration)).Unix()

其中 settings.Get().JWTExpiration 为我提供了我在应用程序设置文件中所做的设置。

我已经编写了一个函数,理想情况下应该给我令牌有效的剩余时间。

func getTokenRemainingValidity(timestamp interface{}) int {
    if validity, ok := timestamp.(float64); ok {
        tm := time.Unix(int64(validity), 0)
        remainder := tm.Sub(time.Now())
        if remainder > 0 {
            return int(remainder.Seconds() + expireOffset)
        }
    }
    return expireOffset
}

然后我像这样调用这个函数:

x := getTokenRemainingValidity(claims["exp"])
fmt.Println(x)

其中 claim["exp"] 是我在解析 jwt 令牌后得到的声明。 但这总是给我相同的输出。即3600。如何检查我的令牌的剩余有效性。我正在使用 golang。

【问题讨论】:

  • 问一下,你为什么不直接使用 golang jwt 包....
  • 您的代码无法编译。 expireOffset 必须是一个 int(因为返回),但 remainder.Seconds() 是一个 float64,所以你不能给它添加一个 int。 expireOffset 的值是多少?还要检查时间戳确实是 float64 而不是数字:golang.org/pkg/encoding/json/#Number

标签: go jwt express-jwt


【解决方案1】:

您总是得到 3600(这似乎是 expireOffset),因为类型断言 timestamp.(float64) 失败,因为 timestamp 的实际值是 int64

func getTokenRemainingValidity(timestamp interface{}) int {
    var expireOffset = 3600
    if validity, ok := timestamp.(int64); ok {
        tm := time.Unix(int64(validity), 0)
        remainder := tm.Sub(time.Now())

        if remainder > 0 {
            return int(remainder.Seconds() + float64(expireOffset))
        }
    }
    return expireOffset
}

为了让它工作,我添加了expireOffset 并将其设置为 3600。 在第一个 return 语句中,expireOffset 必须转换为 float64,然后将结果返回到 int。 这样它就可以工作,虽然我不确定你添加或返回偏移量是什么。

可以查看和测试完整的工作示例here on the Go Playground

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 2023-04-04
    • 2018-01-25
    • 2021-12-24
    • 2020-07-04
    • 2016-09-24
    • 1970-01-01
    相关资源
    最近更新 更多