Json网络令牌不会过期

anv*_*rik 8 node.js jwt express-jwt

我刚刚在我的后端实现了json web令牌认证,我将创建的令牌发送jsonwebtoken给客户端,如下所示:

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

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

编辑:我实现了同样的事情,在这篇文章中显示.

Mar*_*mpf 21

当我没有提供一个对象作为第一个参数时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的通知.确保传递具有所需属性的普通对象,而不是直接数据库对象或类似对象.

  • 我传递了一个对象,但令牌仍然没有过期.我使用`expiresIn:60`因为"expiresInMinutes"现在已被弃用. (2认同)

Dav*_*yon 4

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

本教程开始,有效性检查应该抛出异常:

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

    // handle token here

  } catch (err) {
    return next();
  }
} else {
  next();
}
Run Code Online (Sandbox Code Playgroud)

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

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