【发布时间】:2019-02-17 15:01:20
【问题描述】:
我想每隔 X 分钟从客户端打一个电话,看看 JWT 是否仍然有效。我不确定如何在 nodeJS 中执行此操作。如果我已经获得授权,我如何检查我是否仍然获得授权。
【问题讨论】:
-
我不会在设定的时间间隔内这样做 - 它应该在每个需要身份验证的请求上完成。
-
我正在检查不活动。如果令牌由于不活动而过期,我想将应用程序发送回登录页面。
我想每隔 X 分钟从客户端打一个电话,看看 JWT 是否仍然有效。我不确定如何在 nodeJS 中执行此操作。如果我已经获得授权,我如何检查我是否仍然获得授权。
【问题讨论】:
处理令牌过期的一个优雅的解决方案是,当您设置令牌时(在LocalStorage 或 store(redux),或两者中)也有一个在令牌过期时运行的异步函数。像这样的:
const logUserOut = token =>{
setTimeout(()=> MyLogoutFunction(), token.expiresIn)
}
这样可以确保在令牌不再有效时不会记录用户。
【讨论】:
您可以让您的客户端解码 JWT 并检查 expiry 字段并将其与系统时间进行比较。
例如。
isExpired: (token) => {
if (token && jwt.decode(token)) {
const expiry = jwt.decode(token).exp;
const now = new Date();
return now.getTime() > expiry * 1000;
}
return false;
您可以在客户端使用 npm install jsonwebtoken 或其他一些 npm 包来执行此操作
【讨论】:
创建验证令牌有效的端点。您可以使用 jsonwebtoken 包。
import jwt from 'jsonwebtoken';
const verifyToken = (req, res) => {
const token = req.headers.authorization;
jwt.verify(token, SECRET_KEY, (err, decoded) => {
if (err) {
return res.status(401).send();
}
// can do something with the decoded data
})
}
router.post('/verify-token', verifyToken);
【讨论】:
我找到了一个更好的选择,承诺检查我的令牌是否有效
jwt.verify(token,key,(err,result)=>{
if(err){
if(err.name == "TokenExpiredError"){
console.log("Expired") //This case is when token expired
}
else{
console.log(err.name) //Any other case
}
}
else{
//Here code for your promise using 'result' when token is Valid
}
})
编辑:如果您出于安全原因不使用 JWT,则此代码是可以的,前提是您将其用于公共内容。 因为此请求是否有效,如果无效,则向用户显示。 我使用它只是为了了解对象是否由于其他原因仍然可用。 (而且可以公开)
【讨论】: