JWT获取用户详细信息并设置到期时间

时间:2018-11-14 15:30:24

标签: node.js jwt

我正在使用基于JWT令牌的登录系统,并且工作正常。

但是我需要基于JWT令牌获取用户详细信息

exports.signin = function(req, res) {
    User.findOne({
        username: req.body.username
    }, function(err, user) {
        if (err) throw err;
        if (!user || !user.comparePassword(req.body.password)) {
            return res.status(401).json({ message: 'Authentication failed. Invalid user or password.' });
        }
        return res.json({ token: jwt.sign({ email: user.email, username: user.username, _id: user._id }, 'RESTFULAPIs') });
    });
};

app.use(function(req, res, next) {
  if (req.headers && req.headers.authorization && req.headers.authorization.split(' ')[0] === 'JWT') {
    jsonwebtoken.verify(req.headers.authorization.split(' ')[1], 'RESTFULAPIs', function(err, decode) {
      if (err) req.user = undefined;
      req.user = decode;
      next();
    });
  } else {
    req.user = undefined;
    next();
  }
});

我还需要设置到期时间。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

Ref:NodeJs - Retrieve user infor from JWT token?

exports.me = function(req,res){
    if (req.headers && req.headers.authorization) {
        var authorization = headers.authorization,
            decoded;
        try {
            decoded = jwt.verify(authorization, secret.secretToken);
        } catch (e) {
            return res.status(401).send('unauthorized');
        }
        var userId = decoded.id;
        // Fetch the user by id 
        User.findOne({_id: userId}).then(function(user){
            // Do something with the user
            return res.send(200);
        });
    }
    return res.send(500);
}

参考:用于令牌到期/扩展令牌JWT (JSON Web Token) automatic prolongation of expiration 网络应用 一个好的模式是在令牌过期之前刷新令牌。

将令牌到期时间设置为一周,并在用户每次打开Web应用程序时以及每一小时刷新一次令牌。如果用户超过一个星期没有打开应用程序,则他们将不得不再次登录,这是可以接受的Web应用程序用户体验。

要刷新令牌,您的API需要一个新的端点,该端点接收一个有效的,未到期的JWT,并返回带有新到期字段的相同签名的JWT。然后,Web应用程序会将令牌存储在某个地方