页面刷新后如何保持用户登录

Posted

技术标签:

【中文标题】页面刷新后如何保持用户登录【英文标题】:How to keep a user logged in after page refresh 【发布时间】:2019-12-23 16:50:41 【问题描述】:

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

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
  
)

【问题讨论】:

【参考方案1】:

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

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

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

逻辑流程应该是:

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

【讨论】:

谢谢,这就是我的目标......只是关于“它应该包含某种令牌,然后你需要哈希”......令牌已经加密(jwt)我有吗也要散列吗? 令牌相当于密码(甚至 jwt)。所以,基本上如果数据库被泄露,令牌就会被暴露。这就是为什么你应该散列它。【参考方案2】:

在页面的第一行开始会话,并将登录凭据存储在其中。您可以对登录后访问的所有其他页面执行相同操作。

【讨论】:

以上是关于页面刷新后如何保持用户登录的主要内容,如果未能解决你的问题,请参考以下文章

Vue项目保持用户登录状态(localStorage + vuex 刷新页面后状态依然保持)

刷新后如何让用户保持登录到 Firebase 应用程序?

React - 即使刷新了如何保持在同一页面上?

服务器端 Blazor:刷新页面后如何保持用户身份验证?

vue登录刷新回到首页的问题

页面刷新后 React useReducer 钩子状态丢失