JWT - 为什么它产生非凡的长令牌

时间:2017-07-23 06:03:46

标签: jwt

一切正常,直到我决定与用户一起保存令牌(如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"
        });
    }
};

我认为我没有正确刷新令牌。

1 个答案:

答案 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']