页面刷新后如何保持用户登录
Posted
技术标签:
【中文标题】页面刷新后如何保持用户登录【英文标题】:How to keep a user logged in after page refresh 【发布时间】:2019-12-23 16:50:41 【问题描述】:我有一个简单的 Web 应用程序,用户可以创建一个帐户并登录......每当用户登录时,我都会为他生成一个 json-web-token
并将其存储在他的数据库对象中......我正在使用 @987654322 @ 在用户访问某些路由(标头上的 Bearer 令牌)时对用户进行身份验证,但问题是当用户刷新页面时我丢失了该令牌,他必须再次提供电子邮件和密码才能生成另一个令牌...我正在考虑使用 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
)
【问题讨论】:
【参考方案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】:在页面的第一行开始会话,并将登录凭据存储在其中。您可以对登录后访问的所有其他页面执行相同操作。
【讨论】:
以上是关于页面刷新后如何保持用户登录的主要内容,如果未能解决你的问题,请参考以下文章