Node.js 在时间到期时注销用户

Node.js 在时间到期时注销用户,node.js,express,authentication,cookies,Node.js,Express,Authentication,Cookies,我正在使用API开发nodejs(express)服务器和react FE。服务器令牌存储令牌和密钥。当用户从FE注销时,该秘密将被刷新。(原始开发人员使用自定义身份验证,而不是JWT.) 问题是,如果用户不按下注销按钮,他们可以无限期地登录。就解决方案而言,我有一个想法,服务器可以监控来自客户端的最后一个请求,30分钟后,服务器可以更新机密-我手动尝试了这个方法,当客户端刷新时,api调用失败。我可以在FE中构建一些额外的逻辑,捕捉向用户显示注销消息的错误,然后删除本地存储。 此外,客户端可以

我正在使用API开发nodejs(express)服务器和react FE。服务器令牌存储令牌和密钥。当用户从FE注销时,该秘密将被刷新。(原始开发人员使用自定义身份验证,而不是JWT.) 问题是,如果用户不按下注销按钮,他们可以无限期地登录。就解决方案而言,我有一个想法,服务器可以监控来自客户端的最后一个请求,30分钟后,服务器可以更新机密-我手动尝试了这个方法,当客户端刷新时,api调用失败。我可以在FE中构建一些额外的逻辑,捕捉向用户显示注销消息的错误,然后删除本地存储。 此外,客户端可以从上次api调用开始计算25分钟,并在用户注销之前显示带有倒计时的对话框

也许,我把这件事复杂化了,还有另一种方法——目前正在使用本地存储,但不确定我是否要使用cookie,它可以解决浏览器不活动或浏览器关闭时自动注销的问题,还可以在cookie过期之前进行对话倒计时(如果用户选择“保持会话打开”,则更新该会话)

如果有可行的选择,我将不胜感激

代码:

反应代码:

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的所有请求一起发送到服务器的实际令牌
因此,服务器接收到customerSecret,它有一个中间件,用于根据数据库检查该机密,以检查是否应允许用户继续

你几乎没有选择

将列logintime添加到usertable。
  • 当用户登录时,用当前时间戳更新该字段
  • 在数据库中查找机密时,检查登录的时间戳是否在30分钟内
使用饼干
  • 当用户登录时,将机密添加到cookie
  • 在react应用程序中使用withCredentials将cookie发送到服务器
  • 在中间,我们检查cookie,而不是查看数据库
将秘密转移到redis
  • 当用户登录时,使用expire属性将机密添加到redis
  • 以持证人身份从react发送秘密
  • 在中间,我们在redis中查找秘密以检查用户
身份验证和授权中的几个指针:
  • 在每个请求上读取完整的事务数据库是非常昂贵的
  • 会话状态允许数据丢失,无论是否丢失,您都可以重新创建/恢复它
  • 您不应该在localStorage中存储机密或令牌,因为它位于客户端上,因此可由其他应用程序访问

理想情况下,我希望在用户停止与前端交互后超时30分钟。您提到的代码是服务器端的吗?它是server-side.JWT或任何其他密钥,由于XSS攻击,不应存储在本地存储中。您能详细说明这个自定义令牌系统是如何工作的吗?它是一个会话还是一个bear-token或一些类似JWT的json吗(这是过期的财产)我不知道如何回答你的问题,你能从我添加到帖子中的服务器代码中看出吗?-是的,有点帮助。customerToken和customerSecret之间有什么区别?customerToken是客户Id,customerSecret用作密码。这两个都会发送到FE。当FE调用api时,这两个都是customerToken ccustomerSecret被传回服务器并进行身份验证。当客户手动注销时,customerSecret被刷新,当react接收到该机密时,它被存储在本地存储中。该机密被发送回服务器,用于所有安全api调用。服务器检查传入的机密,并将其与存储的版本进行比较(如果有)发生ch时,它允许处理。不检查到期。当令牌首先在服务器上生成时,任何地方都不会记录到期。谢谢。选择选项“使用Cookies”或“将机密移动到redis”-是否意味着我不再需要在DB中存储机密?在这两个选项中,当cookie即将过期,我是否可以在FE上启动脚本以提示用户续订cookie(刷新cookie可能会重新启动客户端计时器)?是的,您不需要将机密存储在数据库中。是的,您可以在FE发出请求时检查cookie和/或redis的过期时间,如果可能是5分钟或更短,您可以再次将其更新为30分钟。嗨,如果我使用cookie,当返回到服务器时,我可以返回customerToken和customerSecret-然后服务器需要检查b这些都是针对Redis或DB的。如果找到,则检查存储的到期。如果到期即将结束,则续订。我想我不需要customerToken来回(因为总是一样的),但customerSecret需要转到FE和BE,因为它经常刷新。这有意义吗?
setTimeout(function(){ req.session.destroy(); }, milliseconds_since_page_loaded);