我正在使用 jwt-go 库创建 jwt 令牌。后来写了一个脚本来加载测试。我注意到当我发送许多并发请求时获得相同的令牌。为了检查更多信息,我在 for 循环中创建了令牌,结果是相同的。
我使用的库是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)
}
Run Code Online (Sandbox Code Playgroud)
JWT 包含三个部分:一个大部分固定的标头、一组声明和一个签名。 RFC 7519有实际的细节。如果标头是固定的并且两个令牌之间的声明是相同的,那么签名也将是相同的,并且您可以轻松获得重复的令牌。两个时间戳声明“iat”和“exp”仅处于第二粒度,因此如果您在同一秒内使用代码发出多个令牌,您将获得相同的结果(即使您将计算移至expirationTime循环内)。
jwt-go 库将RFC 7519 \xc2\xa74.1中列出的StandardClaims导出为结构,这就是您在代码中使用的结构。深入研究库代码,这里没有什么特别微妙的地方:StandardClaims使用普通注释,然后当写出令牌时,声明将被 JSON 编码,然后进行 base64 编码。因此,给定固定的输入,您将得到固定的输出。"encoding/json"
如果您希望每个令牌在某种程度上“不同”,则标准“jti”声明是提供唯一 ID 的地方。这不是标准声明的一部分,因此您需要创建包含它的自己的自定义声明类型。
\ntype UniqueClaims struct {\n jwt.StandardClaims\n TokenId string `json:"jti,omitempty"`\n}\nRun Code Online (Sandbox Code Playgroud)\n然后,当您创建声明结构时,您需要TokenId自己生成一个唯一的。
import (\n "crypto/rand"\n "encoding/base64"\n)\n\nbits := make([]byte, 12)\n_, err := rand.Read(bits)\nif err != nil {\n panic(err)\n}\nclaims := UniqueClaims{\n StandardClaims: jwt.StandardClaims{...},\n TokenId: base64.StdEncoding.EncodeToString(bits),\n}\nRun Code Online (Sandbox Code Playgroud)\nhttps://play.golang.org/p/zDnkamwsCi-有一个完整的例子;每次运行它时,即使您在同一秒内运行多次,您也会获得不同的令牌。您可以手动对令牌的中间部分进行 Base64 解码以查看声明,或使用https://jwt.io/调试器等工具对其进行解码。
\n| 归档时间: |
|
| 查看次数: |
1453 次 |
| 最近记录: |