用户在express js中登录时如何更新令牌?
Posted
技术标签:
【中文标题】用户在express js中登录时如何更新令牌?【英文标题】:How to update token when the user logs in in express js? 【发布时间】:2019-03-03 00:13:54 【问题描述】:我想在用户登录时更新用户集合中的令牌。到目前为止,我已经尝试过了。
router.post("/login", (req, res, next) =>
User.find( email: req.body.email )
.exec()
.then(user =>
if (user.length < 1)
return res.status(401).json(
message: "Auth failed"
);
bcrypt.compare(req.body.password, user[0].password, (err, result) =>
if (err)
return res.status(401).json(
message: "Auth failed"
);
if (result)
const token2 = jwt.sign(
email: user[0].email,iat: Math.floor(Date.now() / 1000) - 30
,
"123",
expiresIn: "1h"
);
User.update(token : token2 )
.exec()
return res.status(200).json(
message: "Auth successful",
token: token2
);
res.status(401).json(
message: "Auth failed"
);
);
)
.catch(err =>
console.log(err);
res.status(500).json(
error: err
);
);
);
这里正在生成新令牌,但它没有保存在用户集合中。我想更新集合中的新令牌。
谁能知道我在哪里失踪?
【问题讨论】:
我可以知道你的MongoDB
版本吗?
我认为您的更新是在执行jwt.sign
之前发生的。看看你能不能得到jwt.sign
的任何回调。
【参考方案1】:
试试类似的东西:
router.post("/login", async (req, res) =>
try
const user = await User.find( email: req.body.email );
if (user.length < 1)
return res.status(401).json(
message: "Auth failed"
);
bcrypt.compare(req.body.password, user[0].password, (err, result) =>
if (err)
return res.status(401).json(
message: "Auth failed"
);
if (result)
const token2 = jwt.sign(
email: user[0].email,iat: Math.floor(Date.now() / 1000) - 30
,
"123",
expiresIn: "1h"
);
User.update(_id:user[0]._id,$set:token : token2 ,new: true);
return res.status(200).json(
message: "Auth successful",
token: token2
);
res.status(401).json(
message: "Auth failed"
);
);
catch(err)
res.status(500).json(
error: err
);
);
【讨论】:
从 find 中删除 .exec() 也是因为在使用时我们不需要 .exec() 来执行查询。 然后你必须在用于 find 的 then 之外运行更新查询。最好使用 async 和 await。【参考方案2】:试试下面的代码:
jwt.sign(
email: user[0].email,iat: Math.floor(Date.now() / 1000) - 30
,
"123",
expiresIn: "1h"
, function(err, token2)
User.update(token : token2 ).exec() //Change the query to update
return res.status(200).json(
message: "Auth successful",
token: token2
);
);
如果有帮助,请告诉我。
【讨论】:
现在令牌没有被打印,只有验证成功被打印 你能不能放一个控制台检查一下token2的值? @BhaktiThakkar【参考方案3】:首先了解为什么需要刷新令牌。创建令牌后,您可以将该令牌作为会话变量存储在网络、移动设备的内部存储等中......
您可以创建另一个令牌,而不是刷新令牌。 以另一种方式,您可以为令牌设置超时。令牌将在该时间段后失效。
【讨论】:
以上是关于用户在express js中登录时如何更新令牌?的主要内容,如果未能解决你的问题,请参考以下文章
当用户在nodeJS / Express和Angular中空闲一段时间(基于令牌的授权)时,我如何使我的JWT令牌过期
如何安全地保存从 auth0 登录收到的 JWT 令牌(nodejs express)
如何使用 express 在用户浏览器的响应标头 cookie 中查找 JSON Web 令牌 (JWT) 来制作 node.js?