2016-01-03 66 views
4

我正在使用golang中的jwt-go库,并使用HS512算法对令牌进行签名。我想,以确保令牌是有效的,并在文档的例子是这样的:如何使用jwt-go库验证JSON Web令牌?

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函数应该这样做,并且值没有kid值,当我打印它到控制台,甚至认为令牌具有我放入它的所有数据时,token.Valid始终是false。 这是一个错误?我如何验证令牌是否有效?

回答

4

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 
})