在服务器端验证 Cognito 访问令牌

Verifying Cognito access tokens server-side

我使用 AdminInitiateAuth(适用于 Go 的 AWS SDK)在服务器端获得了一个 Cognito 访问令牌,我将其存储在会话 cookie 中。我假设我需要在每个后续请求中验证该令牌。我是否需要针对每个请求调用 Cognito,或者我是否可以在我的应用程序服务器端验证令牌?

因为它是一个 Json Web 令牌,您可以使用任何 JWT 库验证它们。

令牌结构在https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html中解释。

阅读上面 link 中的 "Using ID Tokens and Access Tokens in your Web APIs" 部分。

而且seconfly,因为它是一个JWT,你不需要为每个请求调用Cognito。只需验证令牌。

"OpenID 是一个去中心化的身份验证协议" 所以你不必查询数据库服务器或 Cognito 服务器来验证它,因为不对称 RSA 方法。

我对 OpenID 令牌有同样的问题。我正在使用 Cognito 注册登录和注册我的用户。最初,我可以毫无问题地使用 API 网关身份验证器来授权它们,但后来我决定将其移至 Kubernetes 后端。

我发现的最好的想法来自: 线程

https://github.com/awslabs/aws-support-tools/blob/master/Cognito/decode-verify-jwt/decode-verify-jwt.py

中的一个很好的 Python 示例

you'll need the public key in order to verify the JWT token

JWT 令牌具有基于 64 URL 编码的 JSON 格式,其中包含三个字段 <header>.<payload>.<signature>。 在有效负载字段中,您可以找到 iss 字段以在尝试进行验证之前搜索 "kid" public 密钥

testparse := strings.Split(tokenid, ".")
base64decode, err := base64.RawURLEncoding.DecodeString(testparse[1])
fmt.Println("Claims:", string(base64decode))

或更好地使用“github.com/dgrijalva/jwt-go” & “github.com/lestrrat-go/jwx/jwk" 做类似的事情:

jwt.Parse(yourTokenStr, getKeyFunction)

然后在您的 getKeyFunction() 中您可以:

fmt.Println("Header: Alg:", token.Header["alg"], ", Kid: ", token.Header["kid"])

claims := token.Claims.(jwt.MapClaims)

// Print unverified claims
for key, value := range claims {
    log.Printf("%s\t: %v\n", key, value)
    if key == "iss" {
        // AWS cognito uses /.well-known/jwks.json path for the pub key
        jwksURL = value.(string) + "/.well-known/jwks.json"
    }
}
...

如果您的 jwt.Parse(yourTokenStr, getKeyFunction) 不会 return 任何错误,则令牌有效。

例如,您可以获得的错误是“令牌已过期”或(对于我的情况)更通用的“crypto/rsa:验证error" 如果它是过期的 Token_ID.