Passport-jwt 令牌过期
Passport-jwt token expiration
我正在使用 passport-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);
}
};
};
或使某些令牌无效的某种策略
我在数据库中创建了一个文档来存储生成的令牌并添加了到期日期,当用户发出请求时检查令牌是否已过期。
这是我使用的验证策略
/* ----------------------------- 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);
/* -------------------------------------------------------------------------------*/
对我有用。
JWT 的标准是将有效负载中的到期时间作为 "exp"。如果你这样做,passport-JWT 模块将遵守它,除非你明确告诉它不要这样做。比自己实施更容易。
编辑
现在有更多代码!
我通常使用 npm 模块 jsonwebtoken
实际上 creating/signing 我的令牌,它有一个选项可以使用负载的 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 分钟的到期时间(显然,你可以设置其他时间)。
您可以使用以下策略生成JWT-token,有效期为 1 小时。
let token = jwt.sign({
exp: Math.floor(Date.now() / 1000) + (60 * 60),
data: JSON.stringify(user_object)
}, 'secret_key');
res.send({token : 'JWT '+token})
我正在使用 passport-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);
}
};
};
或使某些令牌无效的某种策略
我在数据库中创建了一个文档来存储生成的令牌并添加了到期日期,当用户发出请求时检查令牌是否已过期。
这是我使用的验证策略
/* ----------------------------- 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);
/* -------------------------------------------------------------------------------*/
对我有用。
JWT 的标准是将有效负载中的到期时间作为 "exp"。如果你这样做,passport-JWT 模块将遵守它,除非你明确告诉它不要这样做。比自己实施更容易。
编辑
现在有更多代码!
我通常使用 npm 模块 jsonwebtoken
实际上 creating/signing 我的令牌,它有一个选项可以使用负载的 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 分钟的到期时间(显然,你可以设置其他时间)。
您可以使用以下策略生成JWT-token,有效期为 1 小时。
let token = jwt.sign({
exp: Math.floor(Date.now() / 1000) + (60 * 60),
data: JSON.stringify(user_object)
}, 'secret_key');
res.send({token : 'JWT '+token})