在 Go 中验证 AWS Cognito JWT 令牌
简介
从 JWT 验证和提取信息Amazon Cognito 发行的令牌在 Go 中可能是一个挑战。本文提供了有效处理此任务的简明指南。
先决条件
AWS Cognito 用户必须从 JWKS 终端节点检索公共 JSON Web 密钥 (JWK) 集:
https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/jwks.json
解析 JWK 并验证JWT
要解析 JWK 集并验证 JWT,请考虑使用:
实现
示例代码
package main import ( "fmt" jwt "github.com/dgrijalva/jwt-go" "github.com/lestrrat-go/jwx/jwk" ) func main() { // Replace with your Cognito token and Cognito JWKS endpoint tokenString := "YOUR_JWT_TOKEN" endpoint := "YOUR_COGNITO_JWKS_ENDPOINT" keySet, err := jwk.Fetch(endpoint) if err != nil { fmt.Println(err) return } // Parse the JWT token and validate its signature using the public key 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 }) if err != nil { fmt.Println(err) return } // Access the claims from the validated JWT token claims := token.Claims.(jwt.MapClaims) fmt.Println("User ID: ", claims["sub"]) }
结论
通过利用 jwk 和 jwt-go 等库,开发人员可以在 Go 中高效地验证和检索 Cognito JWT 令牌中的数据,提供一种安全、便捷的方式来对应用程序中的用户进行身份验证。
以上是如何在 Go 中验证 AWS Cognito JWT 令牌?的详细内容。更多信息请关注PHP中文网其他相关文章!