8

我刚刚实现了一个 json Web 令牌身份验证,在我的后端我将创建的令牌发送给jsonwebtoken客户端,如下所示:

var token = jwt.sign(user, secret.secretToken, { expiresInMinutes: 1 });
return res.json({ token: token });

在客户端,我只是将此令牌存储到 SessionStorage。问题是令牌在一分钟后不会过期,我错过了什么吗?

编辑:我实现了这篇文章中显示的相同的东西。

4

3 回答 3

22

我发现自己在不提供对象作为第一个参数时遇到了同样的问题jwt.sign,例如jwt.sign('testuser', secret.secretToken, { expiresIn: '1h' });

jwt.sign即使它是错误的,这种错误用法也确实有效,它只是忽略了提供的设置。https://github.com/auth0/node-jsonwebtoken/issues/64

确保提供一个对象作为第一个参数,例如jwt.sign({user: 'testuser'}, secret.secretToken, { expiresIn: '1h' });

更新: 已经报告了使用非标准 javascript 对象的问题,例如来自 mongoose。5.5.2 版对此进行了修复。更多细节在这里。感谢@gugol 的通知。确保传递具有所需属性的普通对象,而不是直接数据库对象或类似对象。

于 2015-04-21T17:04:05.833 回答
4

令牌不会自动从会话存储中删除。但是,如果您尝试验证令牌是否有效,则过期的令牌应该是无效的。

本教程中,有效性检查应引发异常:

if (token) {
  try {
    var decoded = jwt.decode(token, app.get('jwtTokenSecret'));

    // handle token here

  } catch (err) {
    return next();
  }
} else {
  next();
}

验证也包含在jsonwebtoken包中。这是来自文档:

(与回调同步)如果签名(以及可选的过期、受众、颁发者)有效,则返回解码的有效负载。如果不是,它将返回错误。

于 2014-05-13T09:24:22.497 回答
0
//use this to create the token

  var token = jwt.sign({
  exp: "1h",
  data: "payload"
   }, "secret");

/*while checking the token ,Throws error if the token is expired else you will get the decoded data*/

jwt.verify(token, 'secret', function(err, decoded) {
  if (err) {
    /*
      err = {
        name: 'TokenExpiredError',
        message: 'jwt expired',
        expiredAt: 1408621000
      }
    */
  }
});
于 2018-11-01T18:37:24.793 回答