通过令牌撤销来结束用户会话
您可以使用以下方法撤销刷新令牌和最终用户会话。撤销刷新令牌后,先前由该刷新令牌颁发的所有访问令牌都将失效。向用户颁发的其他刷新令牌不受影响。
- RevokeToken 操作
-
RevokeToken 会撤销给定刷新令牌的所有访问令牌,包括来自交互式登录的初始访问令牌。此操作不会影响用户的任何其他刷新令牌,也不会影响由这些其他刷新令牌派生的 ID 令牌和访问令牌。
- 撤销端点
-
撤销端点会撤销给定的刷新令牌以及该刷新令牌生成的所有 ID 令牌和访问令牌。此端点还会撤销交互式登录的初始访问令牌。对此端点的请求不会影响用户的任何其他刷新令牌,也不会影响由这些其他刷新令牌派生的 ID 令牌和访问令牌。
- GlobalSignOut 操作
-
GlobalSignOut 是一种自助服务,用户使用其访问令牌对其进行授权。此操作会撤销请求用户的所有刷新、ID 和访问令牌。
- AdminUserGlobalSignOut 操作
-
AdminUserGlobalSignOut 是一项服务器端操作,管理员使用 IAM 凭证对其进行授权。此操作会撤销目标用户的所有刷新、ID 和访问令牌。
有关撤销令牌的需知信息
-
您撤销刷新令牌的请求必须包括用于获取该令牌的客户端 ID。
-
用户池 JWT 是独立的,具有在创建令牌时分配的签名和过期时间。已撤销令牌无法与任何需要令牌的 Amazon Cognito API 调用一起使用。但是,如果使用任何验证令牌签名和过期的 JWT 库进行验证,已撤销令牌仍然有效。
-
当您创建新的用户池客户端时,默认会启用令牌撤销。
-
您只能在启用令牌撤销的应用程序客户端中撤销刷新令牌。
-
启用令牌吊销后,Amazon Cognito JSON Web 令牌中会添加新的声明。
origin_jti和jti声明已添加到访问和 ID 令牌中。这些声明增加应用程序客户端访问和 ID 令牌的大小。 -
当您在之前已启用令牌撤销的应用程序客户端中禁用令牌撤销时,已撤销的令牌不会再次启用。
-
当您禁用用户账户(会撤销刷新和访问令牌)后,如果您再次启用该用户账户,已撤销的令牌不会启用。
-
当您使用Amazon Web Services 管理控制台、Amazon CLI 或 Amazon API 创建新的用户池客户端时,默认会启用令牌撤销。
启用令牌撤销
在您为现有的用户池客户端撤销令牌前,必须启用令牌撤销。您可以使用 Amazon CLI 或 Amazon API 为现有用户池客户端启用令牌撤销。为此,请调用 aws cognito-idp
describe-user-pool-client CLI 命令或 DescribeUserPoolClient API 操作以从应用程序客户端检索当前设置。然后调用 aws
cognito-idp update-user-pool-client CLI 命令或 UpdateUserPoolClient API 操作。包括来自您的应用程序客户端的当前设置并将 EnableTokenRevocation 参数设置为 true。
要使用 Amazon Cognito API 或 Amazon SDK 创建或修改启用了令牌撤销的应用程序客户端,请在 CreateUserPoolClient 或 UpdateUserPoolClient API 请求中包含以下参数。
"EnableTokenRevocation":true
要在 Amazon Cognito 控制台中配置令牌撤销,请从用户池的应用程序客户端菜单中选择一个应用程序客户端。在应用程序客户端信息中选择编辑按钮,然后在高级配置下启用或禁用令牌撤销。
撤销令牌
您可以使用 RevokeToken API 请求(例如使用 aws cognito-idp
revoke-token CLI 命令)撤销刷新令牌。您也可以使用撤销端点撤销令牌。此端点在您将域添加到用户池后可用。您可以在 Amazon Cognito 托管域或您的自定义域上使用撤销端点。
以下是示例 RevokeToken API 请求的正文。
{ "ClientId": "1example23456789", "ClientSecret": "abcdef123456789ghijklexample", "Token": "eyJjdHkiOiJKV1QiEXAMPLE" }
以下是对使用自定义域的用户池的 /oauth2/revoke 端点发出的 cURL 请求示例。
curl --location 'auth.mydomain.com/oauth2/revoke' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --header 'Authorization: BasicBase64Encode(client_id:client_secret)' \ --data-urlencode 'token=abcdef123456789ghijklexample' \ --data-urlencode 'client_id=1example23456789'
除非您的应用程序客户端具有客户端密钥,否则 RevokeToken 操作和 /oauth2/revoke 端点不需要额外授权。