我正在使用节点8.11.1,Express 4.16.3,passport @ 0.4.0,passport-jwt @ 4.0.0,jsonwebtoken @ 8.3.0和pg 7.4.2 / pg-promise 8.4.4。 (我的数据库不是mongo,它是PostgreSQL)
我成功登录后会生成jwt,就像这样
const token = jwt.sign({userid: resolved.id, usermail : resolved.mail}, config.secretOrKey, {expiresIn:604800});
return res.json({success:true, token:'JWT '+token, msg:'logged', userid: resolved.id, usermail : resolved.mail});
然后在我的account
路由中,我想控制其访问权限
const express = require('express');
const router = express.Router();
const cmsuser = require('../../db/cmsuser.js');
const {body, validationResult } = require('express-validator/check');
const passport = require('passport');
require('../../db/passport')(passport);
router.get('/', passport.authenticate('jwt', { session: false }), (req, res, next)=>{
res.render('cms/account',{
'title':'account'
});
});
module.exports = router;
并且在我的passport.js
中
const JwtStrategy = require('passport-jwt').Strategy;
const ExtractJwt = require('passport-jwt').ExtractJwt;
const user = require('./index.js');
const config = require('./config.js');
module.exports = (passport)=> {
var opts = {};
opts.jwtFromRequest = ExtractJwt.fromHeader('Authorization');
opts.secretOrKey = config.secretOrKey;
console.log('log');
passport.use(new JwtStrategy(opts, function(jwt_payload, done) {
console.log('jwt_payload ', jwt_payload);
user.query('select id,mail from publisher WHERE id = $1', [jwt_payload.sub])
.then(res => {
console.log('passport res');
return done(null, res) ;
})
.catch(error => {
console.log('passport error');
return done(error, false) ;
});// catch
}));
};
我的app.js
有
const passport = require('passport');
和
app.use(passport.initialize());
app.use(passport.session());
在设置路线之前
console.log('log');
中的passport.js
仅在节点启动后出现一次,并且在以后的任何页面访问中都不会出现。 console.log('jwt_payload ', jwt_payload);
中的passport.js
永远不会出现。
我很困惑,每次访问localhost:3000/cms/account
时中间件都不能工作吗?因此,每次我应该至少在控制台中看到log
时?
我所有的路线中也有next
我在这里想念的是什么,我该如何做?当我访问帐户路由时,似乎中间件根本无法运行。
**如果有什么不同,我将遵循Brad的教程here,但由于我将其教程体现在现有的基本节点项目中,因此路由的结构有所不同。
谢谢