JWT jsonwebtoken在node.js

时间:2015-10-12 18:39:46

标签: javascript node.js express jwt

我使用"jsonwebtoken": "^5.4.0",我无法使我的令牌过期

我用:

创建令牌
var token = jwt.sign(user, app.get('superSecret'), {
    expiresInSeconds: 1
});

我的令牌就像

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJfaWQiOiI1NjFhODE5MjFhZGJmYWI2MzNlZWU4ZjciLCJ1c2VybmFtZSI6ImJhcm5vIiwicGFzc3dvcmQiOiIkMmEkMTAkcnh6SHY0dFFhbkxwVDNQOEVJSzNBTzVhLjcwNUJZdmxIOVhXOHlSVmpUMi9hNEdmTFd4YU8iLCJfX3YiOjAsImNyZWF0ZWRfYXQiOiIyMDE1LTEwLTExVDE1OjM0OjQyLjg3MFoifQ.ooELWBRlxtYwFTmJDFNOLiR6-2uR_-wjjXwPnS0c5Lk

在我的中间件中,我有这个检查

jwt.verify(token, app.get('superSecret'), function (err, decoded) {
    if (err) {
        return res.json({success: false, message: 'Failed to authenticate token.'});
    } else {
        console.dir(decoded);            
        // if everything is good, save to request for use in other routes
        req.decoded = decoded;
        return res.json({success: true, token: decoded});
        next();
    }
});

对于Postman,我做了一个像

一样的帖子请求
Post http://localhost:3000/users
with
x-access-token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJfaWQiOiI1NjFhODE5MjFhZGJmYWI2MzNlZWU4ZjciLCJ1c2VybmFtZSI6ImJhcm5vIiwicGFzc3dvcmQiOiIkMmEkMTAkcnh6SHY0dFFhbkxwVDNQOEVJSzNBTzVhLjcwNUJZdmxIOVhXOHlSVmpUMi9hNEdmTFd4YU8iLCJfX3YiOjAsImNyZWF0ZWRfYXQiOiIyMDE1LTEwLTExVDE1OjM0OjQyLjg3MFoifQ.ooELWBRlxtYwFTmJDFNOLiR6-2uR_-wjjXwPnS0c5Lk

我的令牌始终有效!

console.dir(decoded)
{
  "success": true,
  "token": {
    "_id": "561a81921adbfab633eee8f7",
    "username": "myuser",
  }
}

为什么我的代码始终有效?如何强制使此代码无效,例如logout?

2 个答案:

答案 0 :(得分:0)

库可能不会按时间使令牌无效。在您的情况下,签名可能是正确的,因此您获得已解码变量。可能你需要自己检查一下。

这是检查实际生成的JWT令牌的非常有用的工具。 http://jwt.io/#debugger

答案 1 :(得分:0)

使用jwt.sign()时,提供的第一个参数必须是对象。尝试更换您的代码,如下所示。

var token = jwt.sign({user: user}, app.get('superSecret'), {
    expiresIn: 1
});

此外,使用expiresIn代替expiresInSeconds,因为它已被弃用。