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总是错误的。这是一个错误吗?如何验证令牌是否有效?

4

1 回答 1

10

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

文档中的示例显示了 jwt-go 库提供的非标准(未在RFC 7519中定义)附加功能。使用kid标头中的字段(密钥 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
})
于 2016-01-03T16:20:04.923 回答