gpt4 book ai didi

go - 当在循环内创建 JWT token 时,在 jwt-go 中获取相同的 token

转载 作者:行者123 更新时间:2023-12-01 21:25:40 25 4
gpt4 key购买 nike

我正在使用 jwt-go 库创建 jwt token 。后来写了一个脚本来加载测试。我注意到当我发送许多并发请求时获得相同的 token 。为了检查更多信息,我在 for 循环中创建了 token ,结果是相同的。

我使用的库是https://github.com/dgrijalva/jwt-go ,go版本为1.12.9。

expirationTime := time.Now().Add(time.Duration(60) * time.Minute)

for i := 1; i < 5; i++ {
claims := &jwt.StandardClaims{
ExpiresAt: expirationTime.Unix(),
Issuer:"telescope",
}
_token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
var jwtKey = []byte("secret_key")
auth_token, _ := _token.SignedString(jwtKey)
fmt.Println(auth_token)
}

最佳答案

JWT 包含三个部分:一个基本固定的 header 、一组声明和一个签名。 RFC 7519有实际的细节。如果 header 是固定的并且两个 token 之间的声明是相同的,那么签名也将是相同的,并且您可以轻松获得重复的 token 。两个时间戳声明“iat”和“exp”仅处于第二粒度,因此如果您在同一秒内使用代码发出多个 token ,您将获得相同的结果(即使您移动 expirationTime循环内计算)。

jwt-go 库导出 StandardClaims列于RFC 7519 §4.1作为一个结构,这就是您在代码中使用的结构。深入研究库代码,这里没有什么特别微妙的:StandardClaims使用普通的“encoding/json”注释,然后当写出 token 时,the claims are JSON encoded and then base64-encoded 。因此,给定固定的输入,您将得到固定的输出。

如果您希望每个标记在某种程度上“不同”,the standard "jti" claim是提供唯一ID的地方。这不是 StandardClaims 的一部分,因此您需要创建包含它的自己的自定义声明类型。

type UniqueClaims struct {
jwt.StandardClaims
TokenId string `json:"jti,omitempty"`
}

那么当你创建声明结构时,你需要自己生成一个唯一的TokenId

import (
"crypto/rand"
"encoding/base64"
)

bits := make([]byte, 12)
_, err := rand.Read(bits)
if err != nil {
panic(err)
}
claims := UniqueClaims{
StandardClaims: jwt.StandardClaims{...},
TokenId: base64.StdEncoding.EncodeToString(bits),
}

https://play.golang.org/p/zDnkamwsCi-有完整的例子;每次运行它时,即使您在同一秒内运行多次,您也会获得不同的 token 。您可以手动对 token 的中间部分进行 Base64 解码以查看声明,或使用类似 https://jwt.io/ 的工具。调试器对其进行解码。

关于go - 当在循环内创建 JWT token 时,在 jwt-go 中获取相同的 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57735602/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com