laravel - 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 分钟,没问题。
解决方案
罪魁祸首是session.gc_maxlifetime
php.ini 中的设置被设置为 24 分钟。
推荐阅读
- java - Java小球跑出光标
- c - 共享标志的重定位编译问题
- javascript - 如何为自定义输入建立 ngModel 双向数据绑定,例如在单选按钮上
- debugging - 在 gstreamer 中创建点文件时是否包含日志?
- openedge - OpenEdge BREAK-BY 数量和行总和
- security - 是否有通用方法来确定网络数据是否以加密方式发送?
- html - 如何将开关按钮与表单连接
- mysql - CREATE TABLE SPONSORSHIP 中的 UNIQUE CONSTRAINT 含义
- git - 如何在 Qt Creator 中正确切换 git 的分支?
- ios - 自动缩小多个 ui 标签的文本大小