Passport:错误:passport.initialize()中间件未使用;

时间:2018-03-16 05:51:46

标签: mongodb express mongoose passport.js jwt-simple

我有一个MongoDB和Mongoose的快速服务器,并使用护照对JWT进行身份验证,但是在标题中出现错误。

我正在关注passport-jwt文档,但仍然收到错误。我做错了什么?

以下是使用有效JWT在localhost3090上进行GET调用时的错误消息:

::1 - - [16/Mar/2018:05:35:47 +0000] "GET / HTTP/1.1" 500 1677 "-" "PostmanRuntime/7.1.1"
Error: passport.initialize() middleware not in use
    at IncomingMessage.req.login.req.logIn (/Users/okadachikara/react-courses/projects/server/node_modules/passport/lib/http/request.js:46:34)
    at JwtStrategy.strategy.success (/Users/okadachikara/react-courses/projects/server/node_modules/passport/lib/middleware/authenticate.js:248:13)
    at verified (/Users/okadachikara/react-courses/projects/server/node_modules/passport-jwt/lib/strategy.js:115:41)
    at /Users/okadachikara/react-courses/projects/server/services/passport.js:34:7
    at /Users/okadachikara/react-courses/projects/server/node_modules/mongoose/lib/model.js:3930:16
    at _init (/Users/okadachikara/react-courses/projects/server/node_modules/mongoose/lib/query.js:2007:5)
    at model.Document.init (/Users/okadachikara/react-courses/projects/server/node_modules/mongoose/lib/document.js:393:5)
    at completeOne (/Users/okadachikara/react-courses/projects/server/node_modules/mongoose/lib/query.js:1993:12)
    at Immediate.<anonymous> (/Users/okadachikara/react-courses/projects/server/node_modules/mongoose/lib/query.js:1520:11)
    at Immediate._onImmediate (/Users/okadachikara/react-courses/projects/server/node_modules/mquery/lib/utils.js:119:16)
    at runCallback (timers.js:773:18)
    at tryOnImmediate (timers.js:734:5)
    at processImmediate [as _immediateCallback] (timers.js:711:5)

我的服务器/ controllers / authentication.js:

const User = require('../models/user');
const jwt = require('jwt-simple');

const config = require('../config');

function tokenForUser(user) {
  const timestamp = new Date().getTime();
  return jwt.encode({ sub: user.id, iat: timestamp }, config.secret);
 }

exports.signup = function (req, res, next) {
  const email = req.body.email;
  const password = req.body.password;

  if (!email || !password) {
    return res.status(422).send({ error: 'You must provide an email and 
  password' });
  }

  // see if user with the given email exists
User.findOne({ email: email }, function (err, existingUser) {
  if (err) { return next(err); }
  if (existingUser) {
    return res.status(422).send({ error: 'A user with that email 
 already exists' });
  }
  const user = new User({
    email: email,
    password: password
});

  user.save(function (err) {
    if (err) { return next(err); }
    res.json({ token: tokenForUser(user), iat: jwt.iat });
  });
});
};

我的服务器/ services / passport.js

const passport = require('passport');
const JwtStrategy = require('passport-jwt').Strategy;
const ExtractJwt = require('passport-jwt').ExtractJwt;
const User = require('../models/user');
const config = require('../config');

const jwtOptions = {
  jwtFromRequest: ExtractJwt.fromHeader('authorization'),
  secretOrKey: config.secret
};

const jwtLogin = new JwtStrategy(jwtOptions, function (payload, done) {
  User.findById(payload.sub, function (err, user) {
    if (err) { return done(err, false); }
    if (user) {
      done(null, user);
    } else {
      done(null, false);
    }
  });
});

passport.use(jwtLogin);

我的服务器/ router.js

const passport = require('passport');
const Authentication = require('./controllers/authentication');
const passportService = require('./services/passport');

const requireAuth = passport.authenticate('jwt', { sesssion: false });

module.exports = function (app) {
  app.get('/', requireAuth, function (req, res) {
    res.send({ hi: 'there' });
  });

  app.post('/signup', Authentication.signup);
};

1 个答案:

答案 0 :(得分:2)

您需要在使用之前初始化护照模块:

let app = express();
app.use(passport.initialize());