使用 Cognito 在 Next.js 应用程序中解决会话过期的丑陋解决方法。有更好的解决办法吗?

问题描述 投票:0回答:1

我正在为客户编写一个 Next.js 应用程序。该应用程序使用 NextAuth 通过 AWS Cognito(OAuth、OIDC、JWT 等)对用户进行身份验证。目前,我正在使用 Cognito 托管的 UI 进行身份验证。一切都运转良好。但是,如果用户在没有明确注销的情况下关闭浏览器,客户端希望会话过期。我修改了 NextAuth 配置,使用仅 3 分钟后过期的 JWT cookie,以及只要用户留在网站上就保持会话打开的保持活动状态。到目前为止,一切都很好...除了不是真的。

问题:当用户登录、关闭浏览器并在 5 分钟后重新打开应用程序时,我的本地应用程序会话正确地过期了。这会触发到 Cognito 的重定向。但是,Cognito 仍然为用户提供有效的会话/cookie,该会话/cookie 被硬编码为在 1 小时后过期。这会导致 Cognito 立即使用新的有效令牌将用户重定向回我的应用程序。我希望他们必须重新进行身份验证。因为这个cookie是不可配置的。我认为删除/使其过期的唯一方法是将浏览器重定向到 Cognito 注销页面。

这导致了我丑陋的解决方案......请注意,它有效,但我真的不喜欢它!我所做的就是配置 NextAuth,这样当用户想要登录时,它首先将他们重定向到 Cognito 注销 URL,并带有指向我的应用程序登录 URL 的回调 URL,该回调 URL 发送然后将他们发送回 Cognito(还头晕吗?)。考虑这个例子:

  1. 首先,假设用户已经通过身份验证并且位于我的网站上。
  2. 用户关闭浏览器
  3. 五分钟后,用户重新打开浏览器
  4. NextAuth 检测到用户未经过身份验证(JWT 已过期)并将用户重定向到 Cognito 注销 URL
  5. Cognito 注销用户并将他们重定向回我的网站。请注意,用户实际上并没有在这里看到 Cognito,因为所有 HTTP 响应都是重定向。
  6. 然后,我的应用程序将用户重定向回 Cognito 的正常登录 URL。
  7. 用户会看到 Cognito 登录页面,提示他们输入凭据。
  8. 身份验证成功后,用户将使用新的 JWT 重新登录我的网站。

哇,恶心! ...但它有效并且不是一个糟糕的用户体验。 请告诉我有更好的方法!我自己的想法是:

  1. 接受 Cognito 上的 1 小时过期时间(不太安全)
  2. 不要使用 Cognito(对我来说太晚了)
next.js oauth-2.0 amazon-cognito next-auth
1个回答
0
投票

使用 OpenID Connect 时有以下标准模式:

  • 您发送
    prompt=login
    请求参数以强制重新登录
  • 您可以应用自己的逻辑来决定何时设置
  • 例如,您可以发送
    max_age
    参数,之后授权服务器应要求重新登录
  • 使用
    max_age
    时,您还会获得向 ID 令牌发出的
    auth_time
    声明

不幸的是,在回答这个问题时,我相信 Cognito 不支持

prompt
参数。在此之前,需要您当前类型的解决方法(以及额外的注销重定向)。

© www.soinside.com 2019 - 2024. All rights reserved.