我正在为客户编写一个 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(还头晕吗?)。考虑这个例子:
哇,恶心! ...但它有效并且不是一个糟糕的用户体验。 请告诉我有更好的方法!我自己的想法是:
使用 OpenID Connect 时有以下标准模式:
prompt=login
请求参数以强制重新登录max_age
参数,之后授权服务器应要求重新登录max_age
时,您还会获得向 ID 令牌发出的 auth_time
声明不幸的是,在回答这个问题时,我相信 Cognito 不支持
prompt
参数。在此之前,需要您当前类型的解决方法(以及额外的注销重定向)。