一切正常,直到我决定与用户一起保存令牌(如String)。令牌被用来最多5行,现在每次刷新令牌时都会不断增长。我生成的最后一个令牌是100行,这是不可接受的。
每次用户登录时,我都会刷新令牌。
module.exports.login = function(req, res){
var user_name = req.body.username;
var password = req.body.password;
User.findOne({username: user_name}, function(err, user){
if(err || !user) {
return res.json({error: "cannot find the user"});
} else{
user.comparePassword(password, function(err, isMatch){
if (err){
return res.json({
error: "passowrd doesn't match"
});
}
});
var token = jwt.sign(user, process.env.SECRET, {
expiresIn: 4000
});
console.log(token); // printing the token
}
if(!token){
res.json({
success: false,
username: null,
token: null
});
}
else {
user.token = token;
User.updateUser(user._id, user, {new: true},function(err, updated_user){
res.json({
success: true,
username: user.username,
token: token
});
});
}
});
};
所有路由都是安全的,并且需要验证每个请求的令牌。
module.exports.secured = function(req, res, next){
var token;
var username = req.body.req_username || req.headers['req_username'];
if(username){
User.findOne({ 'username': username }, function (err, user) {
if (err || !user)
return res.json({
error: "cannot find the user"
});
else
token = user.token;
jwt.verify(token, process.env.SECRET, function(err, decode){
if(err){
res.status(500).send({
error: "wrong token or username"
});
} else{
next();
}
});
});
} else{
res.send({
error: "not found"
});
}
};
我认为我没有正确刷新令牌。
答案 0 :(得分:0)
令牌不应存储在服务器中,因为它浪费了不必要的资源。
user.token = token;
User.updateUser(user._id, user, {new: true},function(err, updated_user){
res.json({
success: true,
username: user.username,
token: token
});
});
每次刷新令牌时,您都会编码包含先前发出的令牌的user
变量,因此它会增长
var token = jwt.sign(user, process.env.SECRET, {
expiresIn: 4000
});
删除user.token = token
但主要问题是客户端必须在每个请求中发送JWT,而不是用于恢复令牌的用户名。您正在验证存储在用户实体中的令牌。它没有任何意义。将客户端代码更改为。在标头中发送JWT而不是用户名req.headers['req_username']