jwt护照中间件不起作用

时间:2018-06-23 12:56:24

标签: node.js express jwt passport.js passport-jwt

我正在使用节点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.jsconst 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,但由于我将其教程体现在现有的基本节点项目中,因此路由的结构有所不同。

谢谢

0 个答案:

没有答案