首页 > 解决方案 > Laravel:用户在会话到期之前被注销

问题描述

我正在开发一个用 Laravel 制作的网络应用程序,遇到了一个奇怪的问题。SESSION_LIFETIME 设置为 30 分钟,因此我在前端有一个脚本,用于在 30 分钟结束前 3 分钟检查用户在会话中的剩余时间。这是通过在每次用户采取行动时在后端设置一个 session_expires_at 变量来完成的。到期时间是这样计算的Now + SESSION_LIFETIME

主要问题是用户在 30 分钟结束之前以某种方式退出。如果我将生命周期设置为 20 分钟,则没有问题。

我通过添加一些日志对此进行了测试

[2021-10-22 17:32:01] testing.INFO: Reached CheckOktaTokenForWeb
[2021-10-22 17:32:01] testing.INFO: 2021-10-22 17:32
[2021-10-22 17:32:01] testing.INFO: Session expires at: 2021-10-22 18:02
[2021-10-22 17:32:01] testing.INFO: Okta token is valid
[2021-10-22 17:59:01] testing.INFO: Reached VerifyCsrfToken
[2021-10-22 17:59:01] testing.INFO: 2021-10-22 17:59
[2021-10-22 17:59:01] testing.INFO: Session Lifetime: 30
[2021-10-22 17:59:01] testing.INFO: User is authenticated? No
[2021-10-22 17:59:01] testing.INFO: Reached VerifyCsrfToken
[2021-10-22 17:59:01] testing.INFO: 2021-10-22 17:59
[2021-10-22 17:59:01] testing.INFO: Session Lifetime: 30
[2021-10-22 17:59:01] testing.INFO: User is authenticated? No
[2021-10-22 17:59:01] testing.INFO: Reached VerifyCsrfToken
[2021-10-22 17:59:01] testing.INFO: 2021-10-22 17:59
[2021-10-22 17:59:01] testing.INFO: Session Lifetime: 30
[2021-10-22 17:59:01] testing.INFO: User is authenticated? No

从日志中您可以看到会话生命周期结束前 3 分钟,用户未通过身份验证。用户在这两个时间段之间什么都不做,所以有些东西将他注销,但我完全不知道是什么。

CheckOktaTokenForWeb 是一个自定义中间件,它在 Laravel 的 Auth 中间件之后调用,它只检查第三方身份验证令牌,这也是我设置 session_expires_at 属性的地方。

还有什么可以在 30 分钟过去之前将用户注销并给我一个令牌不匹配错误?正如我所说,如果我将会话生命周期设置为 20 分钟,没问题。

标签: laravelsessioncsrf

解决方案


罪魁祸首是session.gc_maxlifetimephp.ini 中的设置被设置为 24 分钟。


推荐阅读