首页 > 解决方案 > 页面刷新后如何保持用户登录

问题描述

我有一个简单的 Web 应用程序,用户可以创建一个帐户并登录......每当用户登录时,我都会json-web-token为他生成一个并将其存储在他的数据库对象中......token当他访问某些用户时,我使用它来验证用户路由(标题上的不记名令牌)但问题是当用户刷新页面时我丢失了该令牌,他必须再次提供电子邮件和密码才能生成另一个令牌......我正在考虑使用localStorage或者cookies但也许有一种更好/常用的方法...任何建议都会有所帮助,谢谢。

router.post('/user/login' ,async (req,res)=>{
    try {
        const user = await User.findByCredentials(req.body.email,req.body.password)
        const token = await user.generateToken()
        res.send({ user, token })
    } catch(e) {
        res.status(404).send(e)
    }
})
axios({
  method: "post",
  url: "/api/user/login",
  data: {
    email: email,
    password: password
  }
})

标签: node.jsexpressauthenticationjwt

解决方案


使用持久会话(记住我功能)的传统方式是使用 cookie。

您可以设置登录时的最大年龄,比如 30 天。

router.post('/user/login', function(req, res) {
    ....
    req.session.cookie.maxAge = 30 * 24 * 60 * 60 * 1000; // Cookie expires after 30 days
    ....
});

逻辑流程应该是:

  1. 当用户成功登录时,会发出登录 cookie。
  2. 它应该包含某种令牌,然后您需要对其进行HASH ( hash(cookie)) 并将其存储在 DB 中。
  3. 当未登录用户访问该站点并显示登录 cookie 时,将在数据库中查找系列标识符。
  4. 如果它找到了 cookie,它就会被认证,否则会要求登录。

推荐阅读