目前已经实现了登录产生token和token验证(后端服务器端产生、验证)。
但是还需要一下两个需求:
1、每次请求都刷新该token的过期时间。比如,1:00产生一个有效期为1h的token,我
在1:30的时候,请求了一次,需要刷新token过期时间为2:30。而且能否不改变原来token
2、主动使某个token失效。
以下回答参考 皆我百晓生、券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。
要实现这些功能,你可以使用Node.js的express-session
库来管理会话,并结合jsonwebtoken
库来生成和验证令牌。
以下是一个简单的示例,展示了如何处理这两个需求:
const express = require('express');
const session = require('express-session');
const jwt = require('jsonwebtoken');
// 创建一个新的express应用实例
const app = express();
// 设置session存储路径和超时时间
app.use(session({
secret: 'your-secret-key', // 随机字符串或哈希值
resave: false, // 是否保存当前状态
saveUninitialized: true, // 是否在未初始化的情况下保存session
cookie: { maxAge: 60 * 60 * 1000 }, // 设置cookie的过期时间
}));
// 在这里添加你的路由逻辑
// 用于获取用户信息的函数
function getUserInfo(req) {
return req.session.user;
}
// 用于生成并验证令牌的函数
function generateToken(user) {
const token = jwt.sign({ userId: user._id }, process.env.TOKEN_SECRET);
return token;
}
// 用于刷新令牌的函数
function refreshToken(token) {
try {
const decoded = jwt.verify(token, process.env.TOKEN_SECRET);
const newExpireAt = Date.now() + (60 * 60 * 1000); // 更新token的有效期
return jwt.sign(decoded, process.env.TOKEN_SECRET, { expiresIn: newExpireAt });
} catch (error) {
console.error(error);
return null; // 如果验证失败,返回null
}
}
// 用于使令牌失效的函数
function revokeToken(token) {
try {
jwt.verify(token, process.env.TOKEN_SECRET, function(err, decoded) {
if (err) {
console.log("Token is invalid");
return;
}
// 如果token有效,那么就删除它
delete req.session.user;
// 清除token
req.session.destroy(function(err) {
if (err) throw err;
});
// 返回true表示成功撤销令牌
return true;
});
} catch (error) {
console.error(error);
return false; // 如果验证失败,返回false
}
}
// 使用上述函数处理用户的请求
app.get('/api/user/:userId', async (req, res) => {
const user = await getUserInfo(req);
// 根据用户ID生成新的token
const token = generateToken(user);
// 刷新token的有效期
const refreshedToken = refreshToken(token);
// 检查令牌是否已过期
if (!refreshedToken || !await revokeToken(refreshedToken)) {
res.status(401).json({ message: "Session expired or revoked" });
} else {
res.json({ token: token });
}
});
这个例子中,我们首先创建了一个新的Express应用实例,并设置了session存储路径和超时时间。然后,我们在应用中添加了几个路由,包括一个用于获取用户信息的函数和两个用于生成和验证令牌的函数。最后,我们使用这三个函数处理用户的请求,并确保令牌的有效性。
注意,你需要根据你的具体需求修改secret字段,以及生成和验证令牌的具体逻辑。