我在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
总是错误的.这是一个错误吗?如何验证令牌是否有效?
本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 })