【问题标题】:Verifying Cognito access tokens server-side在服务器端验证 Cognito 访问令牌
【发布时间】:2017-12-28 20:47:09
【问题描述】:

我有一个使用 AdminInitiateAuth(适用于 Go 的 AWS 开发工具包)的 Cognito 访问令牌服务器端,并将其存储在会话 cookie 中。我假设我需要在每个后续请求中验证该令牌。我是否需要针对每个请求调用 Cognito,还是可以在我的应用服务器端验证令牌?

【问题讨论】:

    标签: aws-sdk amazon-cognito aws-cognito aws-sdk-go


    【解决方案1】:

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

    我在使用 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 字段来搜索“kid”公钥

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

    例如,您可能会遇到的错误是“Token is expired”或(就我而言)更通用的“crypto/rsa: verification error”(如果是)一个过期的 Token_ID。

    【讨论】:

    • 谢谢。大约 3 年前我就知道了,但很高兴看到有人关心 :)
    【解决方案2】:

    由于它是一个 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 令牌和访问令牌”部分。

    而且 seconfly,由于它是 JWT,您不需要为每个请求调用 Cognito。只需验证令牌即可。

    【讨论】:

      猜你喜欢
      • 2015-10-23
      • 2012-06-05
      • 1970-01-01
      • 2020-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-03
      相关资源
      最近更新 更多