0

我有一个使用AdminInitiateAuth(AWS SDK for Go)的 Cognito 访问令牌服务器端,我将它存储在会话 cookie 中。我假设我需要在每个后续请求中验证该令牌。我是否需要为每个请求调用 Cognito,还是可以在我的应用服务器端验证令牌?

4

2 回答 2

2

OpenID 是一种去中心化的身份验证协议”,因此您不必查询数据库服务器或 Cognito 服务器来验证它,因为采用了非对称RSA方法。

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

我发现的最好的想法来自: How to verify a JWT Token from AWS Cognito in Go?线

以及来自https://github.com/awslabs/aws-support-tools/blob/master/Cognito/decode-verify-jwt/decode-verify-jwt.py的一个很好的 Python 示例

您需要公钥才能验证 JWT 令牌

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

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)不会返回任何错误,则令牌是有效的。

例如,您可以获得的错误是“令牌已过期”或(就我而言)更通用的“ crypto/rsa:验证错误”,如果它是过期的 Token_ID。

于 2020-03-23T11:51:31.467 回答
1

由于它是 Json Web Token,您可以使用任何 JWT 库对其进行验证。

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

阅读上面给出的链接中的“在 Web API 中使用 ID 令牌和访问令牌”部分。

其次,由于它是 JWT,因此您不需要为每个请求调用 Cognito。只需验证令牌。

于 2017-07-25T23:25:36.653 回答