【发布时间】:2021-10-28 23:38:46
【问题描述】:
我正在开发一个 nodejs(express) 服务器和一个使用 API 的 react FE。服务器令牌存储令牌和秘密。当用户退出 FE 时,secret 会被刷新。 (原始开发人员使用自定义身份验证而不是 JWT ..) 问题是,如果用户不按注销按钮,他们可以无限期地登录。就解决方案而言,我有一个想法,服务器可以以某种方式监视来自客户端的最后一个请求,当 30 分钟过去后,服务器可以更新秘密——我手动尝试了这个,当客户端刷新时,api 调用失败不优雅。我可以在 FE 中构建一些额外的逻辑,捕获向用户显示注销消息的错误,然后删除本地存储。 此外,客户端可以从最后一次调用 api 算起 25 分钟,并在退出用户之前显示带有倒计时的对话框。
也许,我把这个复杂化了,还有另一种方法 - 目前使用本地存储,但不确定我是否要使用 cookie,它可以解决浏览器不活动或浏览器关闭时自动注销的问题,以及是否有可能在 cookie 过期之前有一个对话倒计时(如果用户选择保持会话打开,则会更新)
如果有可行的选择,将不胜感激。
代码:
api/createCustomer
schemaObj.customerToken = crypto.createHash('sha1').update(uuidv4()).update(config.hidden.salt).digest('hex');
schemaObj.customerSecret = crypto.createHash('sha256').update(uuidv4()).update(config.hidden.secret).digest('hex');
schemaObj.password = bcrypt.hashSync(password, bcrypt.genSaltSync(10));
api/login
var loginValid = bcrypt.compareSync(password, bidder.password);
....
res.apiSuccess(customer);
反应代码:
axios.post('/api/login', formData)
let { customerToken, customerSecret, isVerified } = res.data.data;
.....
localStorage.setItem("customerData", JSON.stringify({ customerToken, customerSecret }));
【问题讨论】:
-
JWT 或任何其他密钥,由于 XSS 攻击,不应存储在本地存储中。您能否详细说明此自定义令牌系统的工作原理?它是会话还是熊令牌或像 jwt 之类的 json(具有 expire 属性)
-
不知道如何回答您的问题,您能从我添加到帖子中的服务器代码看出吗? -
-
是的,有点帮助。 customerToken 和 customerSecret 有什么区别?
-
customerToken 是客户 ID,customerSecret 充当密码。这两个都被发送到 FE。当从 FE 调用 api 时,这两个 customerToken customerSecret 都会传回服务器并进行身份验证。当客户手动注销时,customerSecret被刷新,
-
当react收到secret时,将其存储在本地存储中。秘密被发送回服务器以进行所有安全 api 调用。服务器检查传入的秘密并将其与存储的版本进行比较,如果发生匹配,则允许处理。没有过期检查。当令牌首先在服务器上生成时,任何地方都不会记录到期。
标签: node.js express authentication cookies