如何在 Go 中使用 JWK 验证 JWT 签名?
验证 JWT 的一个挑战是验证签名。对于 JWK 和 Go 语言尤其如此。
问题
解码器允许我们解析 JWT。然而,验证签名,尤其是使用 JWK 验证签名,带来了不同的挑战。以下是常见错误的示例:
type myClaims struct { jwt.StandardClaims } func main() { claims := &myClaims{} _, err := jwt.ParseWithClaims("ey...", claims, getKey) if err != nil { log.Fatal(err) } }
错误:在令牌中找不到密钥“kid”
解决方案
解决此问题,我们必须提供一个检索公钥的 Keyfunc。以下代码演示了一个解决方案:
const jwksURL = "https://companyx.okta.com/oauth2/v1/keys" func getKey(token *jwt.Token) (interface{}, error) { // TODO: Cache the response to avoid repeated HTTP requests set, err := jwk.FetchHTTP(jwksURL) if err != nil { return nil, err } keyID, ok := token.Header["kid"].(string) if !ok { return nil, errors.New("expecting JWT header to have string kid") } if key := set.LookupKeyID(keyID); len(key) == 1 { return key[0].Materialize() } return nil, fmt.Errorf("unable to find key %q", keyID) }
此 getKey 函数:
通过提供此 getKey 函数,您可以在 Go 中使用 JWK 成功验证 JWT 签名。
以上是如何在 Go 中使用 JWK 验证 JWT 签名?的详细内容。更多信息请关注PHP中文网其他相关文章!