私は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);
}
};
};
またはいくつかのトークンを無効にする戦略
JWTの標準は、有効期限を「exp」としてペイロードに含めることです。そうする場合、明示的に指示しない限り、passport-JWTモジュールはそれを尊重します。自分で実装するよりも簡単です。
[〜#〜]編集[〜#〜]
コードを追加しました!
私は通常、実際にトークンを作成/署名するために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分の有効期限を自動的に尊重します(明らかに、他の時間を設定できます)。
次の戦略を使用して、有効期限が1時間のJWTトークンを生成できます。
let token = jwt.sign({
exp: Math.floor(Date.now() / 1000) + (60 * 60),
data: JSON.stringify(user_object)
}, 'secret_key');
res.send({token : 'JWT '+token})