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

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

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-27 08:32:14217浏览

How to Verify AWS Cognito JWT Tokens in Go?

在 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,请考虑使用:

  • [jwk](https://github.com/lestrrat-go/jwx):对于JWK解析
  • [jwt-go](https://github.com/dgrijalva/jwt-go):用于JWT验证

实现

  1. 使用以下命令获取并解析 JWK 集jwk.Fetch()。
  2. 使用 jwt.Parse() 解析 JWT 令牌。
  3. 从 JWT 标头中提取“kid”字段,以标识 JWK 集中匹配的公钥.
  4. 使用 keySet.LookupKeyID(kid) 检索与“kid”关联的公钥header.
  5. 解析 JWT token 时将公钥分配给 func(token *jwt.Token) (interface{}, error) 回调。

示例代码

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中文网其他相关文章!

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