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

9

我正在使用golang中的jwt-go库,使用HS512算法对令牌进行签名。我想确保令牌是有效的,文档中的示例如下:

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.Valid始终为false。这是一个错误吗?如何验证令牌是否有效?
1个回答

10
keyFunc 应该返回私钥,该库将使用该私钥来验证令牌的签名。如何获取此密钥完全由您决定。
文档中的示例显示了一项非标准功能(未在 RFC 7519 中定义),该功能由 jwt-go 库提供。使用标题中的 kid 字段(缩写为 key ID),客户端可以指定使用哪个密钥签名令牌。在验证时,您可以使用密钥 ID 查找已知密钥之一(如何以及是否实现此密钥查找取决于您)。
如果您不想使用此功能,请不要使用。只需从 keyFunc 返回静态字节流,而无需检查令牌头:
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
})

我认为公钥用于验证签名... - SorinS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接