首页 >后端开发 >Golang >如何在 Go 中轻松解析和验证 AWS Cognito JWT 令牌?

如何在 Go 中轻松解析和验证 AWS Cognito JWT 令牌?

Barbara Streisand
Barbara Streisand原创
2024-12-28 08:33:11311浏览

How to Easily Parse and Verify AWS Cognito JWT Tokens in Go?

在 Go 中解析和验证来自 AWS Cognito 的 JWT 令牌

挑战

从由以下机构颁发的 JWT 令牌中验证和提取信息由于缺乏合适的 Go 软件包,AWS Cognito 可能是一项艰巨的任务。尽管使用了常用的库,但该过程仍然很复杂。本文旨在通过使用适当的库提供分步解决方案来简化此任务。

验证的关键:公钥

验证 JWT 令牌,相应的公钥是必不可少的。这些密钥可以从 AWS Cognito 提供的 JWK(JSON Web Key)URL 获取:

https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/jwks.json

解析密钥并验证令牌

推荐的方法是串联使用 jwk 和 jwt-go 库。 jwx 简化了从 JWK URL 解析公钥,而 jwt-go 协助处理 JWT 令牌:

// Parse public keys
keySet, err := jwk.Fetch(THE_COGNITO_URL_DESCRIBED_ABOVE)

// Verify JWT token
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
    // Check signing method
    if _, ok := token.Method.(*jwt.SigningMethodRS256); !ok {
        return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"])
    }

    // Extract key ID ("kid") from JWT header
    kid, ok := token.Header["kid"].(string)
    if !ok {
        return nil, errors.New("kid header not found")
    }

    // Find the public key
    keys := keySet.LookupKeyID(kid)
    if !ok {
        return nil, fmt.Errorf("key with specified kid is not present in jwks")
    }

    // Parse public key
    var publickey interface{}
    err = keys.Raw(&publickey)
    if err != nil {
        return nil, fmt.Errorf("could not parse pubkey")
    }

    return publickey, nil

Go 中重新获得简单性

通过利用 jwx和 jwt-go 库,验证和解析 AWS Cognito 颁发的 JWT 令牌的过程变得显着简化。这种方法为 Go 中的身份验证和授权提供了清晰简洁的解决方案。

以上是如何在 Go 中轻松解析和验证 AWS Cognito JWT 令牌?的详细内容。更多信息请关注PHP中文网其他相关文章!

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