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

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

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

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

【问题讨论】:

标签: amazon-web-services amazon-cognito aws-cognito


【解决方案1】:

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

  1. 打开您的 AWS Cognito 控制台。
  2. 转到General Settings
  3. 向下滚动到App clients,然后点击编辑。
  4. 点击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. 身份验证令牌在一小时后过期。
  2. 在发布刷新令牌时可能会请求新的身份验证令牌。
  3. 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

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

    这真的很简单。更多信息在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 刷新令牌,这是不安全的。
    猜你喜欢
    • 2021-12-21
    • 2018-04-18
    • 2016-09-23
    • 2017-11-22
    • 2016-12-30
    • 2020-10-27
    • 2018-08-14
    • 1970-01-01
    • 2021-01-03
    相关资源
    最近更新 更多