2016-10-22 138 views
4

我用护照智威汤逊生成我的令牌,但我注意到,令牌永远不会过期,有没有办法按照我设置的规则无效特定的标记,是这样的:护照JWT令牌到期

'use strict'; 
const passport = require('passport'); 
const passportJWT = require('passport-jwt'); 
const ExtractJwt = passportJWT.ExtractJwt; 
const Strategy = passportJWT.Strategy; 
const jwt = require('../jwt'); 
const cfg = jwt.authSecret(); 

const params = { 
    secretOrKey: cfg.jwtSecret, 
    jwtFromRequest: ExtractJwt.fromAuthHeader() 
}; 

module.exports =() => { 
    const strategy = new Strategy(params, (payload, done) => { 
     //TODO: Create a custom validate strategy 
     done(null, payload); 
    }); 
    passport.use(strategy); 
    return { 
     initialize: function() { 
      return passport.initialize(); 
     }, 
     authenticate: function() { 
      //TODO: Check if the token is in the expired list 
      return passport.authenticate('jwt', cfg.jwtSession); 
     } 
    }; 
}; 

或一些策略无效一些令牌

+0

你能解决吗? –

回答

5

JWT的标准是在有效载荷中将expiry包含为“exp”。如果你这样做,护照 - 智威汤逊模块将尊重它,除非你明确地告诉它不要。比自己实施更容易。

编辑

更多的代码

吧!

我通常使用npm模块jsonwebtoken来实际创建/签署我的令牌,该令牌可以使用有效负载的exp元素中友好的时间偏移来设置过期。它的工作原理是这样:

const jwt = require('jsonwebtoken'); 

// in your login route 
router.post('/login', (req, res) => { 
    // do whatever you do to handle authentication, then issue the token: 

    const token = jwt.sign(req.user, 's00perS3kritCode', { expiresIn: '30m' }); 
    res.send({ token }); 
}); 

然后你JWT战略可以像你所拥有的已经从我所看到的,它会自动地尊重我上面设置30分钟至到期时间(很明显,你可以设置其他时间)。

+0

你能举个例子吗? – 1fabiopereira

+0

延长令牌生命周期的最佳做法是什么?例如,如果用户想要在应用程序中花费超过30分钟的时间? – trojek

+0

这是通过通常所说的“刷新令牌”来完成的,这基本上意味着您要求针对特定端点的新验证令牌。客户端应用程序通常必须积极主动。更多详情:https://auth0.com/blog/refresh-tokens-what-are-they-and-when-to-use-them/ – Paul

-1

我在于存储所生成的令牌数据库中创建的一个文件,并增加了到期日期,当用户请求检查如果令牌是过期的或否定的。

这是我使用的验证策略。

/* ----------------------------- Create a new Strategy -------------------------*/ 
const strategy = new Strategy(params, (payload, done) => { 

    const query = { 
     token: jwtSimple.encode(payload, credentials.jwtSecret), 
     expires: {$gt: new Date()} 
    }; 

    TokenSchema.findOne(query, (err, result) => { 
     if (err) done(err, null); 
     if (!result) done(null, null); 
     done(null, payload); 
    }); 
}); 
passport.use(strategy); 
/* -------------------------------------------------------------------------------*/ 

这对我很有用。

+4

如果你仍然这样做,我会建议停下来。您错过了JWT的全部内容,因为它们应该是无状态的。 –

+0

是的,这里的做法很糟糕。有状态方法的更好选择。 –