Go语言 如何检查JWT令牌的剩余有效时间

wkyowqbh  于 2022-12-16  发布在  Go
关注(0)|答案(1)|浏览(301)

我使用以下命令设置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)

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

mbskvtky

mbskvtky1#

因为类型Asserttimestamp.(float64)失败,而timestamp的实际值是int64,所以总是得到3600(看起来是expireOffset)。

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中查看和测试。

相关问题