刷新令牌 - Amazon Cognito
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

刷新令牌

您可以使用刷新令牌来检索新的 ID 令牌和访问令牌。默认情况下,刷新令牌会在您的应用程序用户登录用户池的 30 天后过期。当您为用户池创建应用程序时,您可以将应用程序的刷新令牌到期时间设置为介于 60 分钟和 10 年之间的任何值。

使用刷新令牌获取新的访问权限和身份令牌

Amazon Cognito 会发出刷新令牌,以响应通过托管登录授权代码流程和 API 操作或 SDK 方法成功进行身份验证。刷新令牌会返回新的 ID 和访问令牌,还可以返回新的刷新令牌(可选)。您可以通过以下方式使用刷新令牌。

GetTokensFromRefreshToken

GetTokensFromRefreshTokenAPI 操作从有效的刷新令牌中发布新的 ID 和访问令牌。如果您启用了刷新令牌轮换,则还会获得新的刷新令牌。

InitiateAuth 和 AdminitiateAuth

AdminInitiateAuthInitiateAuthAPI 操作包括REFRESH_TOKEN_AUTH身份验证流程。在此流程中,您将传递刷新令牌并获得新的 ID 和访问令牌。启用刷新令牌轮换后,您无法使用应用程序REFRESH_TOKEN_AUTH内客户端进行身份验证。

OAuth 令牌端点

具有的用户池中的令牌端点具有一种refresh_token授予类型,用于从有效的刷新令牌中颁发新 ID、访问权限以及可选(使用刷新令牌轮换)刷新令牌。

刷新代币轮换

通过刷新令牌轮换,您可以选择将用户池配置为使原始刷新令牌失效,并在每次刷新令牌时发出新的刷新令牌。启用此设置后,所有形式的令牌刷新成功请求都会返回一个新的 ID、访问权限刷新令牌。新的刷新令牌在原始刷新令牌的剩余时间内有效。您可以将应用程序客户端配置为轮换刷新令牌或延续原始刷新令牌。要允许在短时间内重试,您还可以为原始刷新令牌配置最多 60 秒的宽限期。

关于刷新令牌轮换的注意事项
  • 启用刷新令牌轮换后,您的用户池中的 JSON Web 令牌中会添加新的声明。origin_jtijti 声明已添加到访问和 ID 令牌中。这些索赔增加了索赔的规模 JWTs。

  • 刷新令牌轮换与身份验证流程不兼容REFRESH_TOKEN_AUTH。要实现刷新令牌轮换,您必须在应用程序客户端中禁用此身份验证流程,并将您的应用程序设计为使用 GetTokensFromRefreshTokenAPI 操作或等效的 SDK 方法提交令牌刷新请求。

  • 当刷新令牌轮换处于非活动状态时,您可以使用或完成令牌刷新请求。GetTokensFromRefreshToken REFRESH_TOKEN_AUTH

  • 设备记忆在用户池中处于活动状态时,您必须在GetTokensFromRefreshToken请求中提供设备密钥。如果您的用户没有您的应用程序在初始身份验证请求中提交的已确认设备密钥,Amazon Cognito 会发布一个新的密钥。要刷新此配置中的令牌,您必须提供设备密钥,无论您是在身份验证响应中AuthParameters指定了设备密钥还是在身份验证响应中收到了新密钥。

  • 您可以在请求中传递ClientMetadata到令牌生成前 Lambda 触发器。GetTokensFromRefreshToken这些数据将传递给触发器的输入事件,并提供其他上下文,您可以在 Lambda 函数的自定义逻辑中使用这些上下文。

作为安全最佳实践,请在应用程序客户端上启用刷新令牌轮换。

Enable refresh token rotation (console)

以下过程打开或关闭应用程序客户端的刷新令牌轮换。此过程需要现有的应用程序客户端。要了解有关创建应用程序客户端的更多信息,请参阅特定于应用程序的应用程序客户端设置

启用刷新令牌轮换
  1. 转到 Amazon Cognito 控制台。如果出现提示,请输入您的 Amazon 凭据。

  2. 选择 User Pools(用户池)。

  3. 从列表中选择现有用户池。

  4. 导航到应用程序客户端菜单,然后选择现有的应用程序客户端。

  5. 从页面的 “应用程序客户端信息” 部分选择 “编辑”。

  6. 在 “高级安全配置” 下,找到 “启用刷新令牌轮换” 选项。

  7. 要启用旋转,请选中该复选框。要禁用旋转,请取消选中该复选框。

  8. 刷新令牌轮换宽限期下,输入要设置为撤消轮换刷新令牌之前的延迟时间(最多 60 秒)。

Enable refresh token rotation (API)

CreateUserPoolClientUpdateUserPoolClientAPI 请求中配置刷新令牌轮换。以下部分请求正文开启刷新令牌轮换并将宽限期设置为十秒。

"RefreshTokenRotation" : { "Feature" : "ENABLED, "RetryGracePeriodSeconds" : 10 }

API 和 SDK 令牌刷新

有两种方法可以使用刷新令牌通过用户池 API 获取新 ID 和访问令牌,具体取决于刷新令牌轮换是否处于活动状态。在启用刷新令牌轮换的应用程序客户端中,使用 GetTokensFromRefreshTokenAPI 操作。在没有刷新令牌轮换的应用程序客户端中,使用AdminInitiateAuthInitiateAuthAPI 操作REFRESH_TOKEN_AUTH流程。

注意

用户可以在托管登录或使用您构建的自定义应用程序 Amazon SDKs 和 Amazon Cognito API 操作中使用用户池进行身份验证。REFRESH_TOKEN_AUTH流程和GetTokensFromRefreshToken都可以为托管登录用户完成令牌刷新。自定义应用程序中的令牌刷新不会影响托管登录会话。这些会话在浏览器 Cookie 中设置,有效期为一小时。GetTokensFromRefreshToken响应会发出新的 ID、访问权限和可选的刷新令牌,但不会续订托管登录会话 Cookie。

REFRESH_TOKEN_AUTH在启用刷新令牌轮换的应用程序客户端中不可用。

GetTokensFromRefreshToken

GetTokensFromRefreshToken返回您使用刷新令牌授权的请求中的新 ID、访问和刷新令牌。以下是的请求正文示例GetTokensFromRefreshToken。您可以在请求此操作时向 Lambda 触发器提交客户端元数据。

{ "RefreshToken": "eyJjd123abcEXAMPLE", "ClientId": "1example23456789", "ClientSecret": "myappclientsecret123abc", "ClientMetadata": { "MyMetadataKey" : "MyMetadataValue" }, }
AdminInitiateAuth/InitiateAuth

要在刷新令牌轮换处于非活动状态时使用刷新令牌,请使用AdminInitiateAuthInitiateAuthAPI 操作。为 AuthFlow 参数传递 REFRESH_TOKEN_AUTH。在 AuthFlowAuthParameters 属性中,将用户的刷新令牌作为 "REFRESH_TOKEN" 的值进行传递。在您的 API 请求通过所有质询后,Amazon Cognito 会返回新的 ID 和访问令牌。

以下是使用InitiateAuthAdminInitiateAuth API 刷新令牌的请求正文示例。

{ "AuthFlow": "REFRESH_TOKEN_AUTH", "ClientId": "1example23456789", "UserPoolId": "us-west-2_EXAMPLE", "AuthParameters": { "REFRESH_TOKEN": "eyJjd123abcEXAMPLE", "SECRET_HASH": "kT5acwCVrbD6JexhW3EQwnRSe6fLuPTRkEQ50athqv8=" } }

OAuth 令牌刷新

您也可以将刷新令牌提交给用户群体中您在其中配置了域的令牌端点。在请求正文中,加入 refresh_tokengrant_type 值和用户刷新令牌的 refresh_token 值。

对令牌端点的请求可在启用刷新令牌轮换的应用程序客户端和处于非活动状态的应用程序客户端中使用。当刷新令牌轮换处于活动状态时,令牌端点会返回一个新的刷新令牌。

以下是带有刷新令牌的请求示例。

POST /oauth2/token HTTP/1.1 Host: auth.example.com Content-Type: application/x-www-form-urlencoded Authorization: Basic ZGpjOTh1M2ppZWRtaTI4M2V1OTI4OmFiY2RlZjAxMjM0NTY3ODkw Content-Length: ** client_id=1example23456789&grant_type=refresh_token&refresh_token=eyJjd123abcEXAMPLE

撤消刷新令牌

您可以撤销属于用户的刷新令牌。有关撤消令牌的更多信息,请参阅通过令牌撤销来结束用户会话

注意

撤消刷新令牌将撤消 Amazon Cognito 从具有该令牌的刷新请求中发出的所有 ID 和访问令牌。

要让用户退出当前所有登录会话,请使用或 API 请求撤消其所有令牌。GlobalSignOutAdminUserGlobalSignOut注销用户后,会发生以下影响。

  • 用户的刷新令牌无法获取该用户的新令牌。

  • 用户的访问令牌无法发出经过令牌授权的 API 请求。

  • 用户必须重新进行身份验证以获取新的令牌。由于托管登录会话 Cookie 不会自动过期,因此您的用户可以使用会话 Cookie 重新进行身份验证,无需额外提示输入凭据。在您注销托管登录用户后,将他们重定向到,Amazon Cognito 将在那里清除他们的会话 cookie。注销端点

使用刷新令牌,您可以将用户的会话长时间保留在您的应用程序中。随着时间的推移,您的用户可能希望取消对某些使用刷新令牌保持登录状态的应用程序的授权。要将您的用户从单个会话中注销,请撤消他们的刷新令牌。当您的用户想要退出所有经过身份验证的会话时,请生成 GlobalSignOutAPI 请求。应用程序可以为用户提供一个选择,如从所有设备注销GlobalSignOut 接受用户的有效(即未更改、未过期、未撤消的)访问令牌。由于此 API 经过令牌授权,因此一个用户无法使用它来发起另一个用户的注销。

但是,您可以生成一个 AdminUserGlobalSignOutAPI 请求,该请求由您使用您的 Amazon 凭据进行授权,以便将任何用户从其所有设备上注销。管理员应用程序必须使用 Amazon 开发者凭据调用此 API 操作,并将用户池 ID 和用户名作为参数传递。AdminUserGlobalSignOut API 可以在用户池中注销任何用户。

有关您可以使用 Amazon 凭证或用户访问令牌授权的请求的更多信息,请参阅按授权模型分组的 API 操作列表