首页 >后端开发 >Golang >如何在 Go 中验证来自 AWS Cognito 的 JWT 令牌?

如何在 Go 中验证来自 AWS Cognito 的 JWT 令牌?

Linda Hamilton
Linda Hamilton原创
2024-12-15 01:40:11758浏览

How to Validate JWT Tokens from AWS Cognito in Go?

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

本文解决了从 Amazon Cognito 颁发的 JWT 令牌验证和提取信息的挑战。讨论了与 Google 身份验证和 Cognito 令牌端点的集成过程以及常见陷阱。

获取公钥

要验证 JWT 令牌,需要公钥。 Cognito 在以下位置提供了包含公钥的 JSON Web 密钥 (JWK) 集:

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

这个文件结构可以手动解析生成公钥,但是使用像jwx这样的库(https://github.com/lestrrat-go/jwx) 简化了流程。

使用 JWT-Go 进行令牌验证

一旦公钥可用,jwt可以利用 -go (https://github.com/dgrijalva/jwt-go) 来验证令牌。以下步骤概述了该过程:

  1. 使用 jwx 解析 JWK 集:
keySet, err := jwk.Fetch(THE_COGNITO_URL_DESCRIBED_ABOVE)
  1. 使用 jwt-go 解析令牌时,使用 " kids" 字段来查找适当的密钥验证:
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
    if _, ok := token.Method.(*jwt.SigningMethodRS256); !ok {
        return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"])
    }
    kid, ok := token.Header["kid"].(string)
    if !ok {
        return nil, errors.New("kid header not found")
    }
    keys := keySet.LookupKeyID(kid)
    if !ok {
        return nil, fmt.Errorf("key with specified kid is not present in jwks")
    }
    var publickey interface{}
    err = keys.Raw(&publickey)
    if err != nil {
        return nil, fmt.Errorf("could not parse pubkey")
    }
    return publickey, nil
})

通过以下步骤,开发人员可以在 Go 中有效验证和解析来自 AWS Cognito 的 JWT 令牌,确保令牌的真实性和完整性。

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

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