首页 >后端开发 >Golang >如何在 Go 中使用 JWK 验证 JWT 签名?

如何在 Go 中使用 JWK 验证 JWT 签名?

Linda Hamilton
Linda Hamilton原创
2024-12-28 17:00:12954浏览

How to Verify JWT Signatures Using JWKs in Go?

如何在 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 函数:

  1. 从提供的 URL 获取公钥。
  2. 从JWT 标头。
  3. 使用 key 查找 key ID。
  4. 将密钥具体化为 jwt-go 可用于验证的接口。

通过提供此 getKey 函数,您可以在 Go 中使用 JWK 成功验证 JWT 签名。

以上是如何在 Go 中使用 JWK 验证 JWT 签名?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn