使用访问令牌
用户池访问令牌包含有关经身份验证的用户声明、用户组列表以及范围列表。访问令牌的主要用途是在用户池中用户的环境中授予 API 操作权限。例如,您可以使用访问令牌授予用户访问权限以添加、更改或删除用户属性。
访问令牌以 JSON Web Token(JWT)表示。访问令牌的标头与 ID 令牌具有相同的结构。但是,密钥 ID(kid
)不同,因为用于签署 ID 令牌和访问令牌的密钥不同。与 ID 令牌一样,您必须先在 Web API 中验证访问令牌的签名,然后才能信任它的任何声明。请参阅验证 JSON Web 令牌。您可以将访问令牌过期时间设置为 5 分钟到 1 天之间的任何值。您可以根据应用程序客户端设置此值。
对于访问和 ID 令牌,请勿将最小值指定少于一小时。Amazon Cognito HostedUI 使用有效期为一小时的 Cookie。如果您输入的最短时间不到一个小时,则无法获得较短的过期时间。
访问令牌标头
标头包含两部分信息:密钥 ID (kid
) 和算法 (alg
)。
{ "kid" : "1234example=" "alg" : "RS256", }
- 密钥 ID(
kid
) -
kid
参数是一个提示,指示哪些密钥用于保护令牌的 JSON Web Signature (JWS)。有关
kid
参数的更多信息,请参阅密钥标识符(kid)标头参数。 - 算法(
alg
) -
alg
参数表示用于保护访问令牌的加密算法。用户池使用 RS256 加密算法,这是一种采用 SHA-256 的 RSA 签名。有关
alg
参数的更多信息,请参阅算法(alg)标头参数。
访问令牌有效负载
这是来自访问令牌的示例负载。有关更多信息,请参阅 JWT 声明
{ "sub": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", "device_key": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", "cognito:groups": [ "admin" ], "token_use": "access", "scope": "aws.cognito.signin.user.admin", "auth_time": 1562190524, "iss": "https://cognito-idp.us-west-2.amazonaws.com/us-west-2_example", "exp": 1562194124, "iat": 1562190524, "origin_jti": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", "jti": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", "client_id": "57cbishk4j24pabc1234567890", "username": "janedoe@example.com" }
- 主题(
sub
) -
sub
声明是经过身份验证的用户的唯一标识符(UUID)。它不同于用户名,后者可能不是唯一的。 - Amazon Cognito 组(
cognito:groups
) -
cognito:groups
声明是用户所属的组列表。 - 令牌使用(
token_use
) -
token_use
声明描述了该令牌的预期用途。对于访问令牌,它的值始终为access
。 - 范围(
scope
) -
范围声明是 Oauth 2.0 范围的列表,用于定义令牌提供的访问权限。
- 身份验证时间(
auth_time
) -
auth_time
声明包含身份验证发生的时间。其值是一个 JSON 数字,代表从 1970-01-01T0:0:0Z 开始的秒数,以 UTC 格式为单位。在刷新时,它代表原始身份验证发生的时间,而不是发布令牌的时间。 - 发布者(
iss
) -
iss
声明采用以下格式:https://cognito-idp.{region}.amazonaws.com/{userPoolId}.
- 来源 JTI (
origin_jti
) -
当来源发生身份验证时,系统所产生的原始 JWT 标识符。
- JTI (
jti
) -
jti
声明是 JWT 的唯一标识符。
访问令牌签名
访问令牌的签名根据 JWT 令牌的标头和负载计算。在 Web API 中,当您在应用程序外部使用时,您必须始终先验证此签名,然后才能接受该令牌。有关更多信息,请参阅 JWT 令牌。