我在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
函数应该做什么?和{{ 1}}当我将其打印到控制台时没有token.Header
值,甚至认为令牌包含我放入的所有数据,kid
始终为false。 这是一个错误吗?如何验证令牌是否有效?
答案 0 :(得分:6)
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
})