go - 如何使用 jwt-go 库验证 JSON Web Token?

标签 go jwt jwt-go

我在 golang 中使用 jwt-go 库,并使用 HS512 算法对 token 进行签名。我想确保 token 有效并且文档中的示例是这样的:

token, err := jwt.Parse(myToken, func(token *jwt.Token) (interface{}, error) {
    return myLookupKey(token.Header["kid"])
})

if err == nil && token.Valid {
    fmt.Println("Your token is valid.  I like your style.")
} else {
    fmt.Println("This token is terrible!  I cannot accept this.")
}

我知道 myToken 是字符串标记,keyFunc 传递的是解析后的标记,但我不明白 myLookupKey 函数是什么应该做什么?,并且 token.Header 没有 kid 值,当我将它打印到控制台时甚至认为 token 包含我放入其中的所有数据, token.Valid 始终为 false。 这是一个错误吗?如何验证 token 是否有效?

最佳答案

keyFunc 应该返回库应该用来验证 token 签名的私钥。如何获得此 key 完全取决于您。

文档中的示例显示了 jwt-go 库提供的非标准(未在 RFC 7519 中定义)附加功能。使用 header 中的 kid 字段( key ID 的缩写),客户端可以使用 哪个 key 来指定 token 已签名。在验证时,您可以使用 key ID 查找(可能是几个)已知 key 之一(如何以及是否实现此 key 查找取决于您)。

如果您不想使用此功能,请不要使用。只需从 keyFunc 返回静态字节流,无需检查 token header :

token, err := jwt.Parse(myToken, func(token *jwt.Token) (interface{}, error) {
    key, err := ioutil.ReadFile("your-private-key.pem")
    if err != nil {
        return nil, errors.New("private key could not be loaded")
    }
    return key, nil
})

关于go - 如何使用 jwt-go 库验证 JSON Web Token?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34578326/

相关文章:

json - 停止 json.Marshal() 从 float 中去除尾随零

主作用域结束时不调用 goroutine 的延迟

c# - 为多个 API 调用重用不记名 token

token - JWT token 中 "kid"声明的含义是什么?

go - 我有公钥和 JWT,如何检查它在 Go 中是否有效?

parsing - 使用 jwt-go 库 - key 无效或类型无效

interface - 可以在结构中嵌入结构以满足接口(interface)吗

pointers - 解析指针

angular - 如何在客户端以 Angular 解码 JWT 编码的 token 有效负载?

go - JWT key 无效