Node.js 在时间到期时注销用户
我正在使用API开发nodejs(express)服务器和react FE。服务器令牌存储令牌和密钥。当用户从FE注销时,该秘密将被刷新。(原始开发人员使用自定义身份验证,而不是JWT.) 问题是,如果用户不按下注销按钮,他们可以无限期地登录。就解决方案而言,我有一个想法,服务器可以监控来自客户端的最后一个请求,30分钟后,服务器可以更新机密-我手动尝试了这个方法,当客户端刷新时,api调用失败。我可以在FE中构建一些额外的逻辑,捕捉向用户显示注销消息的错误,然后删除本地存储。 此外,客户端可以从上次api调用开始计算25分钟,并在用户注销之前显示带有倒计时的对话框 也许,我把这件事复杂化了,还有另一种方法——目前正在使用本地存储,但不确定我是否要使用cookie,它可以解决浏览器不活动或浏览器关闭时自动注销的问题,还可以在cookie过期之前进行对话倒计时(如果用户选择“保持会话打开”,则更新该会话) 如果有可行的选择,我将不胜感激 代码: 反应代码:Node.js 在时间到期时注销用户,node.js,express,authentication,cookies,Node.js,Express,Authentication,Cookies,我正在使用API开发nodejs(express)服务器和react FE。服务器令牌存储令牌和密钥。当用户从FE注销时,该秘密将被刷新。(原始开发人员使用自定义身份验证,而不是JWT.) 问题是,如果用户不按下注销按钮,他们可以无限期地登录。就解决方案而言,我有一个想法,服务器可以监控来自客户端的最后一个请求,30分钟后,服务器可以更新机密-我手动尝试了这个方法,当客户端刷新时,api调用失败。我可以在FE中构建一些额外的逻辑,捕捉向用户显示注销消息的错误,然后删除本地存储。 此外,客户端可以
axios.post('/api/login', formData)
let { customerToken, customerSecret, isVerified } = res.data.data;
.....
localStorage.setItem("customerData", JSON.stringify({ customerToken, customerSecret }));
也许像
setTimeout(function(){ req.session.destroy(); }, milliseconds_since_page_loaded);
或者在最合适的地方使用req.session.destroy()
也许你可以设置一个变量作为上次调用后的时间,然后每分钟给它++,然后添加到执行调用的任何函数中重置它,每30分钟/多长时间检查一次该变量。我会尝试为它编写代码,但我想我今天需要休息一下。我会尝试尽快回来检查这是否足够有用 如果您想在登录时过期,您必须将时间戳属性保存在某个位置以进行检查。大多数标准的身份验证系统都有此功能,例如JWT有exp声明,Cookie有max age 对于您描述的自定义系统,您需要自己跟踪它 据我所知,这个系统
- customerToken=客户的id
- customerPassword=登录密码
- customerSecret=与来自react的所有请求一起发送到服务器的实际令牌
- 当用户登录时,用当前时间戳更新该字段
- 在数据库中查找机密时,检查登录的时间戳是否在30分钟内
- 当用户登录时,将机密添加到cookie
- 在react应用程序中使用withCredentials将cookie发送到服务器
- 在中间,我们检查cookie,而不是查看数据库
- 当用户登录时,使用expire属性将机密添加到redis
- 以持证人身份从react发送秘密
- 在中间,我们在redis中查找秘密以检查用户
- 在每个请求上读取完整的事务数据库是非常昂贵的
- 会话状态允许数据丢失,无论是否丢失,您都可以重新创建/恢复它
- 您不应该在localStorage中存储机密或令牌,因为它位于客户端上,因此可由其他应用程序访问
setTimeout(function(){ req.session.destroy(); }, milliseconds_since_page_loaded);