【问题标题】:JWT get user details and set expire timeJWT 获取用户详细信息并设置过期时间
【发布时间】:2019-04-17 14:54:55
【问题描述】:

我正在使用基于 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();
  }
});

我还需要设置过期时间。

我该怎么做?

【问题讨论】:

  • 你可以看看这个详细的answer

标签: node.js jwt


【解决方案1】:

参考: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 应用程序 UX。

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

【讨论】:

【解决方案2】:

修改你的代码如下:-

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.' });
    }
    let NumberOfDayInMiliSec = 1000 * 60 * 60 * 24 * 1 //One Day
    return res.json({ token: jwt.sign({ exp: Date.now() + NumberOfDayInMiliSec, 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;
      if (decode.exp < Date.now()) {
        return res.status(400).json({ status: false, msg: "Token expired" });
      }
      req.user = decode;
      next();
    });
  } else {
    req.user = undefined;
    next();
  }
});

【讨论】:

    猜你喜欢
    • 2014-11-08
    • 2018-08-12
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    相关资源
    最近更新 更多