node.js - 页面刷新后如何保持用户登录
问题描述
我有一个简单的 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
}
})
解决方案
使用持久会话(记住我功能)的传统方式是使用 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,它就会被认证,否则会要求登录。
推荐阅读
- bootstrap-4 - 请向我解释此特定示例的 Bootstrap 网格的行为
- ios - ISO8601DateFormatter 未将字符串转换为日期
- swift - 为什么 swift 中的这个正则表达式不起作用?
- android - android dexDebug 或 dexRelease 任务后如何执行 gradle 任务
- c++ - 如何在 XCB 中正确地重新堆叠所有窗口(如 XLIB 中的 XRestackWindows)
- python - 如何使用 Azure 函数中的 pymongo 连接到 Cosmos DB
- authentication - MSAL SSO:如何在子 iframe 中获取父窗口的登录帐户信息?
- mysql - 我需要在 MySQL 中编写一个带有多个案例和一个使我出错的连接的查询
- css - 适用于 IOS 的 CSS 运动路径(偏移路径)替代方案?
- mysql - 从 mysql 中的表中检索图像并运行 base64 以在写入文件系统之前对其进行解码