我希望使用 Amazon Cognito 用户池来进行我的应用程序身份验证。以哪种方式可以安全地验证客户端向我的应用程序发送的 ID 和访问令牌?

客户端借助用户池来进行应用程序身份验证时,Amazon Cognito 会发送一个 ID 令牌。您可能希望手动验证该 ID 令牌以信任其中包含的信息。例如:

  • 您创建了一个 Web 应用程序并希望使用 Amazon Cognito 用户池进行身份验证。
  • 您使用 Amazon Cognito 用户池进行身份验证,并使用 Amazon Cognito 身份池来检索 AWS Security Token Service (AWS STS) 的临时凭证。利用这些凭证将调用 AWS Lambda,但 Lambda 并不拥有谁最初使用用户池进行了身份验证的信息。

如要获取 Amazon Cognito JSON Web Key Token (JWT) 中所含的详细 Amazon Cognito 用户信息,您可以对其进行解码并验证签名。如要使用 AWS Lambda 解码和验证 Amazon Cognito JWT,请参阅 GitHub 网站的解码和验证 Amazon Cognito JWT 令牌

在用户登录后,Amazon Cognito 用户池将会返回一个 JWT,这是一个包含用户相关信息 (称为声明) 的 JSON 字符串,采用 base64 编码。Amazon Cognito 会返回三个令牌:ID 令牌、访问令牌和刷新令牌。ID 令牌包含 Amazon Cognito 用户池中定义的用户字段。

JWT 令牌由三个部分组成:标头、负载和签名。

ID 令牌的标头如下例所示。标头包含密钥 ID (“kid”) 和算法 (“alg”),用于令牌的签名。在此例中,算法为“RS256”,这是一条采用 SHA-256 的 RSA 签名。

{
  "kid": "abcdefghijklmnopqrsexample=",
  "alg": "RS256"
}

令牌的负载部分如下例所示,该部分提供了有关用户的信息,以及有关令牌创建和过期时间的时间戳。

{
  "sub": "aaaaaaaa-bbbb-cccc-dddd-example",
  "aud": "xxxxxxxxxxxxexample",
  "email_verified": true,
  "token_use": "id",
  "auth_time": 1500009400,
  "iss": "https://cognito-idp.ap-southeast-2.amazonaws.com/ap-southeast-2_example",
  "cognito:username": "anaya",
  "exp": 1500013000,
  "given_name": "Anaya",
  "iat": 1500009400,
  "email": "anaya@example.com"
}

令牌的签名部分如下例所示,它是由标头和负载哈希化组合而成。Amazon Cognito 会为每个用户池生成两对 RSA 密钥。其中一个私有密钥用于令牌签名。对应的公有密钥在采用此格式的地址中可用:

https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/jwks.json

JSON 文件的结构采用如下格式:

{
    "keys": [{
        "alg": "RS256",
        "e": "AQAB",
        "kid": "abcdefghijklmnopqrsexample=",
        "kty": "RSA",
        "n": "lsjhglskjhgslkjgh43lj5h34lkjh34lkjht3example",
        "use": "sig"
    }, {
        "alg":
        "RS256",
        "e": "AQAB",
        "kid": "fgjhlkhjlkhexample=",
        "kty": "RSA",
        "n": "sgjhlk6jp98ugp98up34hpexample",
        "use": "sig"
    }]
}

如要验证 Amazon Cognito JWT 的签名,首先要搜索密钥 ID 与 JWT 的密钥 ID 匹配的密钥。然后使用库来解码令牌,然后验证签证。此外还必须验证:

  • 令牌尚未过期。
  • 负载中所列的受众 (“aud”) 与 Amazon Cognito 用户池中创建的应用程序客户端 ID 相匹配。

这一解决办法适用于大多数应用程序。如要使用 AWS Lambda,请参阅 GitHub 网站上的解码和验证 Amazon Cognito JWT 令牌


此页面对您有帮助吗? |

返回 AWS Support 知识中心

需要帮助? 请访问 AWS 支持中心

发布时间:2018 年 2 月 13 日