

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 了解访问令牌
<a name="amazon-cognito-user-pools-using-the-access-token"></a>

用户池访问令牌包含有关经身份验证的用户声明、用户组列表以及作用域列表。访问令牌的目的是授权执行 API 操作。您的用户池接受访问令牌以授权用户执行自助操作。例如，您可以使用访问令牌授予用户访问权限以添加、更改或删除用户属性。

通过访问令牌中的 [OAuth 2.0 作用](https://www.rfc-editor.org/rfc/rfc6749#section-3.3)域（源自您添加到用户池中的自定义范围），您可以授权您的用户从 API 检索信息。例如，Amazon API Gateway 支持使用 Amazon Cognito 访问令牌进行授权。您可以使用用户池中的信息填充 REST API 授权方，也可以使用 Amazon Cognito 作为 HTTP API 的 JSON 网络令牌（JWT）授权方。要生成具有自定义作用域的访问令牌，您必须通过用户池[公有端点](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-userpools-server-contract-reference.html)请求访问令牌。

借助基础版或增值版[功能计划](cognito-sign-in-feature-plans.md)，您还可以实施令牌生成前 Lambda 触发器，在运行时为您的访问令牌添加作用域。有关更多信息，请参阅 [令牌生成前 Lambda 触发器](user-pool-lambda-pre-token-generation.md)。

用户的 `openid` 作用域的访问令牌，是允许通过 [userInfo 端点](userinfo-endpoint.md)请求有关您的用户属性的更多信息的权限。来自 `userInfo` 端点的信息量源自访问令牌中的额外作用域：例如，`profile` 用于获取所有用户数据，`email` 用于获取用户的电子邮件地址。

用户的 `aws.cognito.signin.user.admin` 作用域的访问令牌，是读取和写入用户属性、列出身份验证因素、配置多重身份验证（MFA）首选项以及管理记住的设备的权限。您的访问令牌授予此范围的属性访问权限级别与您分配给应用程序客户端的属性 read/write 权限相匹配。

访问令牌是 [JSON Web 令牌 (JWT)](https://www.rfc-editor.org/rfc/rfc7519)。访问令牌的标头与 ID 令牌具有相同的结构。Amazon Cognito 使用与签署 ID 令牌的密钥所不同的密钥对访问令牌进行签名。访问密钥 ID (`kid`) 声明的值与来自同一用户会话的 ID 令牌中 `kid` 声明的值不匹配。在您的应用程序代码中，单独验证 ID 令牌和访问令牌。在验证签名之前，请勿信任访问令牌中的声明。有关更多信息，请参阅 [验证 JSON Web 令牌](amazon-cognito-user-pools-using-tokens-verifying-a-jwt.md)。您可以将访问令牌过期时间设置为 5 分钟到 1 天之间的任何值。您可以按应用程序客户端设置此值。

**重要**  
对于访问令牌和 ID 令牌，如果使用托管登录，请勿将最小值指定为少于一小时。托管登录会设置有效期为一小时的浏览器 Cookie。如果您将访问令牌的持续时间配置为小于一小时，这不会影响托管登录 Cookie 的有效性，也不会影响用户在初始登录后一小时内无需其他凭证即可重新进行身份验证的能力。

## 访问令牌标头
<a name="user-pool-access-token-header"></a>

标头包含两部分信息：密钥 ID (`kid`) 和算法 (`alg`)。

```
{
"kid" : "1234example="
"alg" : "RS256",
}
```

**`kid`**  
 密钥 ID。其值指示用于保护令牌的 JSON Web Signature (JWS) 的密钥。您可以在`jwks_uri`终端节点上查看您的用户池签 IDs 名密钥。  
有关 `kid` 参数的更多信息，请参阅[密钥标识符 (kid) 标头参数](https://tools.ietf.org/html/draft-ietf-jose-json-web-key-41#section-4.5)。

**`alg`**  
Amazon Cognito 用于保护访问令牌的加密算法。用户池使用 RS256 加密算法，即带有 SHA-256 的 RSA 签名。  
有关 `alg` 参数的更多信息，请参阅[算法（alg）标头参数](https://tools.ietf.org/html/draft-ietf-jose-json-web-key-41#section-4.4)。

## 访问令牌默认有效载荷
<a name="user-pool-access-token-payload"></a>

这是来自访问令牌的示例负载。有关更多信息，请参阅 [JWT 声明](https://tools.ietf.org/html/rfc7519#section-4)。您可以使用 [令牌生成前 Lambda 触发器](user-pool-lambda-pre-token-generation.md) 添加自有设计的声明。

```
<header>.
{
   "sub":"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
   "device_key": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
   "cognito:groups":[
      "testgroup"
   ],
   "iss":"https://cognito-idp.us-west-2.amazonaws.com/us-west-2_example",
   "version":2,
   "client_id":"xxxxxxxxxxxxexample",
   "aud": "https://api.example.com",
   "origin_jti":"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
   "event_id":"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
   "token_use":"access",
   "scope":"phone openid profile resourceserver.1/appclient2 email",
   "auth_time":1676313851,
   "exp":1676317451,
   "iat":1676313851,
   "jti":"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
   "username":"my-test-user"
}
.<token signature>
```

**`sub`**  
经过身份验证的用户的唯一标识符（[UUID](cognito-terms.md#terms-uuid)）或主题。用户名在您的用户群体中可能不是唯一的。`sub` 声明是识别给定用户的最佳方法。

**`cognito:groups`**  
以您的用户为成员的用户群体组的名称数组。

**`iss`**  
颁发令牌的身份提供者。声明采用以下格式。  
`https://cognito-idp.us-east-1.amazonaws.com/us-east-1_EXAMPLE`

**`client_id`**  
对用户进行身份验证的用户群体应用程序客户端。Amazon Cognito 在 ID 令牌 `aud` 声明中呈现相同的值。

**aud**  
访问令牌要授权的 API 的 URL。仅当您的应用程序向授权服务器请求[资源绑定](cognito-user-pools-define-resource-servers.md#cognito-user-pools-resource-binding)时才会显示。

**`origin_jti`**  
与用户的刷新令牌关联的令牌撤消标识符。Amazon Cognito 在检查您是否通过[撤销端点](revocation-endpoint.md)或 API 操作撤销了用户的令牌时会引用该`origin_jti`声明。[RevokeToken](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RevokeToken.html)当您撤销令牌时，Amazon Cognito 将不再对访问权限以及具有相同 `origin_jti` 值的 ID 令牌进行验证。

**`token_use`**  
令牌的预期用途。在访问令牌中，其值为 `access`。

**`scope`**  
向登录用户发布的 OAuth 2.0 范围列表。作用域定义令牌为`userInfo`端点上的外部 APIs、用户自助服务操作和用户数据提供的访问权限。[令牌端点](token-endpoint.md) 中的令牌可以包含您的应用程序客户端支持的任何作用域。来自 Amazon Cognito API 登录的令牌仅包含作用域 `aws.cognito.signin.user.admin`。

**`auth_time`**  
您的用户完成身份验证的身份验证时间，采用 Unix 时间格式。

**`exp`**  
您的用户令牌的过期时间，采用 Unix 时间格式。

**`iat`**  
Amazon Cognito 颁发您的用户令牌的时间，采用 Unix 时间格式。

**`jti`**  
JWT 的唯一标识符。

**`username`**  
用户池中用户的用户名。

**更多资源**
+ [如何在 Amazon Cognito 用户池中自定义访问令牌](https://aws.amazon.com/blogs/security/how-to-customize-access-tokens-in-amazon-cognito-user-pools/)

## 访问令牌签名
<a name="user-pool-access-token-signature"></a>

访问令牌的签名使用在 `.well-known/jwks.json` 端点公布的密钥进行签名，可验证令牌标头和有效载荷的完整性。当您使用访问令牌授权外部访问时 APIs，请务必将您的 API 授权方配置为根据签名该签名的密钥来验证此签名。有关更多信息，请参阅 [验证 JSON Web 令牌](amazon-cognito-user-pools-using-tokens-verifying-a-jwt.md)。