【问题标题】:When does API Gateway validate revoked Cognito ID tokenAPI Gateway 何时验证已撤销的 Cognito ID 令牌
【发布时间】:2018-03-13 03:55:02
【问题描述】:

我正在构建一个使用 Cognito 进行登录/注销的无服务器反应应用程序。该应用程序调用配置为使用 Cognito 用户池作为自定义授权方的 API 网关。

我还构建了一个 lambda 函数来注销用户 (cognitoIdentityServiceProvider.globalSignOut)。

当我登录应用程序,然后调用 lambda 函数执行管理员注销时,从应用程序对受保护 API 网关函数的调用仍然有效(在 Authorization 标头中传递 Cognito ID 令牌);

cognitoIdentityServiceProvider.globalSignOutcognitoIdentityServiceProvider.adminUserGlobalSignOut 等管理员调用不是实时的,还是 API 网关配置为仅在一小时后验证?

【问题讨论】:

    标签: aws-api-gateway amazon-cognito


    【解决方案1】:

    刚刚找到答案,可惜不是我想听到的:

    因为 IdToken 表示为 JSON Web Key Token,所以它已签名 使用秘密或私钥/公钥对,这意味着即使您 撤销 IdToken,没有办法撤销分布式公共 钥匙。而且IdToken的生命周期很短,很快就会过期 时间。

    Is it possible to revoke AWS Cognito IdToken?

    https://github.com/aws/aws-sdk-js/issues/1687

    https://github.com/aws/amazon-cognito-identity-js/issues/21

    【讨论】:

    • 就我的经验而言,上述内容似乎也适用于访问令牌。 globalSignOut 声称要撤销 access token 但我的 API Gateway Cognito 池授权方在我使用上述 API 撤销它后仍然接受它
    【解决方案2】:

    这是 Cognito 用户池的默认设置。访问令牌在用户进行身份验证后一小时到期。过期后不应处理。

    您可以使用 GlobalSignOut 和 AdminUserGlobalSignOut API 撤销所有用户令牌。用户退出后:

    • 用户的刷新令牌不能用于为用户获取新令牌。
    • 用户的访问令牌不能用于用户池服务。
    • 用户必须重新进行身份验证才能获取新令牌。

    应用可以使用 GlobalSignOut API 来允许个人用户从所有设备上注销自己。通常,应用会将此选项显示为一个选项,例如从所有设备中退出。应用程序必须使用用户的有效、未过期、已撤销的访问令牌调用此方法。此方法不能用于允许用户注销另一个用户。

    管理员应用可以使用 AdminUserGlobalSignOut API 来允许管理员从所有设备上注销用户。管理员应用程序必须使用 AWS 开发人员凭证调用此方法,并将用户池 ID 和用户的用户名作为参数传递。 AdminUserGlobalSignOut API 可以注销用户池中的任何用户。

    请看官方文档:- http://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html

    【讨论】:

    • 感谢您的回复,但您能否确认调用 adminUserGlobalSignOut 会或不会立即注销用户,但仅在需要使用刷新令牌之后,一个小时前。就我而言,我需要立即终止用户会话,但这似乎并非如此,因为在调用 API Gateway 时带有令牌的 authorization 标头仍显示有效会话(即,API Gateway 不返回有关无效用户令牌或类似内容的错误,例如“访问令牌已被撤销”。请根据 API 网关的已知行为相应地更新您的答案。
    • 更新了我的问题以明确令牌。使用 Cognito 用户池的 API Gateway 自定义授权者只需要 Cognito ID 令牌 (axios.defaults.headers.common.Authorization = session.idToken.jwtToken;)。
    【解决方案3】:

    我是 Cognito 团队的一员。 globalSignOut 撤销访问令牌和刷新令牌。 id 令牌是不记名令牌,用于用户池外部的系统。 API Gateway 仍会接受,但有效期为 1 小时。

    【讨论】:

    • 谢谢,Ionut!。我的无服务器 Web 应用程序在 API Gateway 中使用 Cognito 用户池授权方来强制执行 API 安全性。 API Gateway 仅验证 ID 令牌(不验证访问或刷新)。如果 lambda cron 函数调用 adminUserGlobalSignOut 20 分钟。登录后,从技术上讲,API 网关将在二十分钟后接受令牌,最多一个小时。我会提出这是设计中的一个差距,你认为呢?最终,我试图模仿一个基于服务器的框架,其中会话通常会在 15-30 分钟后过期。 Cognito 似乎专注于 1 小时或更长时间更合适的移动应用体验。
    • 也许是因为我在这次谈话中迟到了一年,所以事情可能已经改变了。但我将 access tokens 与 API 网关一起使用。通过调用 globalSignOut 撤销令牌似乎对与 API Gateway + Cognito 用户池一起使用的 access tokens 没有影响。
    猜你喜欢
    • 2018-09-21
    • 2023-03-12
    • 1970-01-01
    • 2014-06-06
    • 2022-11-15
    • 2021-12-27
    • 1970-01-01
    • 2019-02-28
    • 2017-06-20
    相关资源
    最近更新 更多