如何修改 AWS Cognito 用户池的访问令牌和身份令牌的到期时间

Posted

技术标签:

【中文标题】如何修改 AWS Cognito 用户池的访问令牌和身份令牌的到期时间【英文标题】:How to modify expiry time of the access and identity tokens for AWS Cognito User Pools 【发布时间】:2017-07-31 11:20:55 【问题描述】:

我找不到任何文档来解释是否以及如何修改 AWS Cognito 用户池的访问和身份令牌的到期时间。

documentation 指定默认情况下在发射后 1 小时到期。

有没有办法修改过期时间?

【问题讨论】:

有一种方法可以使用 CloudFormation 来配置 Expiration Time,答案如下(仍在本页底部):***.com/a/64242923/1115187 【参考方案1】:

截至 2020 年 8 月 12 日,AWS has announced 用户池现在支持自定义令牌过期时间。以下是要遵循的步骤:

    打开您的 AWS Cognito 控制台。 转到General Settings。 向下滚动到App clients,然后点击编辑。 点击Show Details按钮查看自定义选项如下:

访问令牌的过期时间必须在 5 分钟到 1 天之间。不能大于刷新令牌过期时间。

有关 AWS cognito 的更多详细信息,您可以关注此link。

【讨论】:

终于! cognito 团队花了足够长的时间——仍然一个巨大的相关问题是 Cognito 仍然不允许在 api 调用中使 all 令牌失效 谢谢,我没找到 :) @chrylis-cautiouslyoptimistic- 虽然我仍然可以使用此选项,但您是否提到过此选项不再可用的说法? @chrylis-cautiouslyoptimistic- 它仍然显示在我的控制台上。 是的,我也可以在控制台中看到它。【参考方案2】:

目前无法为您的用户池进行配置。每个人都设置为一小时。

编辑:查看 Mike 的评论,这是最近添加的。

【讨论】:

一年半之后,我想知道关于 ID 和 ACCESS 令牌的到期是否有任何变化?我似乎找不到对文档的任何更改,但我想我会在这里询问并继续前进。 是的,这是我很想测试的一个功能。目前很难测试注销/令牌过期场景。 @Jeff Bailey 让 Cognito 团队考虑了 SPA 应用程序,对于哪些刷新令牌不能安全地存储在浏览器中并且访问令牌过期 1 小时通常对用户来说不方便?许多 SPA 开发人员将非常感激能够安全地保持用户身份验证超过一个小时。 2020/08 更新:您现在可以编辑 cognito 用户池的访问、ID 和刷新令牌的生命周期。 aws.amazon.com/about-aws/whats-new/2020/08/… @MikeFogel 这是个好消息,但链接并没有告诉你怎么做【参考方案3】:

我认为问题是如何获得对 Cognito 会话终止的精细控制。有一种方法可以做到这一点。但首先让我们回顾一下 Cognito 会话管理的工作原理:

    身份验证令牌在一小时后过期。 在发布刷新令牌时可能会请求新的身份验证令牌。 1 到 30 天后,Cognito 不会发出刷新令牌 - 每个应用的天数在应用客户端设置中配置。

那么,您如何才能更好地控制 Cognito 会话长度?答案是在您的 http 请求堆栈中插入一个过滤器来评估请求 - 如果用户必须出于某种原因注销,请发出 302 重定向到 Cognito 注销端点(并清除您的会话 cookie)。

这就是我们在 Kubernetes 中使用 Envoy(使用代理)和 Spring 所做的。它还允许您连接逻辑,在用户的 1 小时访问令牌过期之前立即撤销对用户的访问。

见https://docs.aws.amazon.com/cognito/latest/developerguide/logout-endpoint.html

【讨论】:

我的用例是这样的,我们已将 Cognito 用户池配置为联合身份验证到我公司的 SAML 提供商,并通过 SSO 进行登录。现在,当用户在公司的用户管理解决方案中更改其组成员身份时,我们如何确保这会影响用户使用 Web 应用程序的能力,因为 Cognito 令牌不会从公司的用户管理解决方案中刷新。我们正在考虑使用注销按钮来实现这一点。但是,我们还想阻止当前的 Cognito 会话永久存在,我们如何实现呢? 组嵌入到令牌中。因此,要获得更新的组,您需要获得一个新的令牌。您应该能够将您的用户重定向到登录流程,并且应该会为您刷新它。我试过了,它对我有用。 另外,Cognito 会话不是永久的。可以在应用程序客户端设置中设置天数。如果您想控制会话到期的更多信息,请在需要终止会话时实现注销并将用户重定向到注销。我使用http过滤器来做到这一点。确切的机制将取决于您使用的堆栈。 是的,Cognito 令牌确实包含组。你是对的,为了获得更新的组,我们需要获得一个新的令牌。问题是,应用程序如何知道新组可用,因此应将客户重定向到登录流程?默认行为是 idToken 和 accessToken 的有效期为一小时,refreshToken 的有效期为 30 天。一旦 idToken 过期,refreshToken 只会刷新令牌,而不会实际获取具有新组的新 idToken。 如果您只想测试您的身份验证刷新是否有效,而无需等待一个小时,该怎么办?【参考方案4】:

澄清:此回复是关于访问令牌(不是刷新令牌)

您可以从 cognito 控制台 General Settings / App Clients / your app / Show Details / Refresh token expiration (days) 配置令牌过期时间

https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html

默认情况下,刷新令牌会在您的应用用户后 30 天过期 登录到您的用户池。当您为用户池创建应用程序时, 您可以将应用的 刷新令牌到期时间(以天为单位)设置为任何值 介于 1 到 3650 之间。

目前对于网络客户端来说,似乎没有不到一天的选择(很奇怪)。

如果你使用 Mobile SDK 那么

https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html

适用于 android 的 Mobile SDK 提供了更改最低要求的选项 ID 和访问令牌的有效期为 0 到 30 分钟。参见 setRefreshThreshold() 方法 适用于 Android 的 AWS 移动开发工具包中的 CognitoIdentityProviderClientConfig API 参考。

【讨论】:

问题是关于访问令牌,而不是刷新令牌。 @Neil 回顾了“刷新阈值”的功能,它似乎实际上是令牌过期的宽大因素,而不是生命周期本身。查看 CognitoIdentityProviderClientConfig.java,您会看到此值必须介于 min (0ms) 和 max(1,800,000ms 或 30min)之间,默认值(300,000ms 或 5min)。我观察到 id 令牌直到 5 分钟过去后才开始在 sdks(或服务器 API)中被拒绝,这可能是阈值的用途。但这似乎与本次讨论无关,除非您查看 60 到 90 分钟。【参考方案5】:

如果您使用 CloudFormation 模板,请添加以下属性并以天为单位指定(尽管官方文档说它默认为小时)访问令牌应该有效的时间。这是一个访问令牌有效期为 24 天的示例。

UserPoolClient:
    Type: "AWS::Cognito::UserPoolClient"
    Properties:
        ClientName: myuserpoolclient
        GenerateSecret: true
        UserPoolId: !Ref YourUserPool
        AccessTokenValidity: 24

文档: https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPoolClient.html#CognitoUserPools-CreateUserPoolClient-request-AccessTokenValidity

【讨论】:

【参考方案6】:

Cognito 使用OAuth 2.0 Specification。为了更新过期的令牌,您需要使用 Refresh Token 值来获取新的 Id Token

    为了在开始时进行身份验证,从用户那里收集用户 ID 和密码并将其发送到 Cognito。 你拿回了两个令牌。一种用于“访问”API,另一种用于在访问到期时“刷新”。 您无需再次要求用户输入用户名和密码;您只需要使用“刷新”令牌。 您不需要存储密码的明文(这会产生安全风险),因为“刷新”令牌将为您提供新的访问令牌。

这真的很简单。更多信息在Cognito documentation to Refresh Tokens

【讨论】:

但对于别无选择只能将刷新令牌存储在浏览器中的 SPA 应用程序due to Cognito's limitations, it's not so simple。 在这种情况下,我可以向您推荐一些 Cognito + APIGateway 的组合。 docs.aws.amazon.com/apigateway/latest/developerguide/… 然后您可以与 Cognito 用户池身份验证 API docs.aI cws.amazon.com/cognito/latest/developerguide/token-endpoint.html 进行交互 我的观点是刷新令牌应该被安全地存储(例如,最好是在私有服务器上,加密数据库上),但是 SPA 应用程序通常具有有限的基础设施,并且由于令牌在 1 小时内到期,因此无法避免存储客户端浏览器中的 Cognito 刷新令牌,这是不安全的。

以上是关于如何修改 AWS Cognito 用户池的访问令牌和身份令牌的到期时间的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core AWS Cognito JWT

使用多个用户池的具有 Cognito 授权的 AWS API 网关

如何从 AWS cognito 授权代码获取访问和刷新令牌

AWS Cognito:将自定义声明/属性添加到 JWT 访问令牌

如何缓存来自 cognito 的 ID 令牌,以便后续访问 API 网关?

我如何从 AWS Cognito Api 获取机器对机器的令牌