passport.js passport.initialize() middleware not in use

匿名 (未验证) 提交于 2019-12-03 02:14:01

问题:

I am using node with express + mongoose and trying to use passport.js with restful api.
I keep getting this exception after authentication success (I see the callback url on the browser):

/Users/naorye/dev/naorye/myproj/node_modules/mongoose/lib/utils.js:419         throw err;               ^ Error: passport.initialize() middleware not in use     at IncomingMessage.req.login.req.logIn (/Users/naorye/dev/naorye/myproj/node_modules/passport/lib/passport/http/request.js:30:30)     at Context.module.exports.delegate.success (/Users/naorye/dev/naorye/myproj/node_modules/passport/lib/passport/middleware/authenticate.js:194:13)     at Context.actions.success (/Users/naorye/dev/naorye/myproj/node_modules/passport/lib/passport/context/http/actions.js:21:25)     at verified (/Users/naorye/dev/naorye/myproj/node_modules/passport-facebook/node_modules/passport-oauth/lib/passport-oauth/strategies/oauth2.js:133:18)     at Promise.module.exports.passport.use.GitHubStrategy.clientID (/Users/naorye/dev/naorye/myproj/config/passport.js:91:24)     at Promise.onResolve (/Users/naorye/dev/naorye/myproj/node_modules/mongoose/node_modules/mpromise/lib/promise.js:162:8)     at Promise.EventEmitter.emit (events.js:96:17)     at Promise.emit (/Users/naorye/dev/naorye/myproj/node_modules/mongoose/node_modules/mpromise/lib/promise.js:79:38)     at Promise.fulfill (/Users/naorye/dev/naorye/myproj/node_modules/mongoose/node_modules/mpromise/lib/promise.js:92:20)     at /Users/naorye/dev/naorye/myproj/node_modules/mongoose/lib/query.js:1822:13 

I have read that I should put app.use(passport.initialize()); and app.use(passport.session()); before app.use(app.router); and this is what I did. Here is my express.js that registers the middlewares:

var express = require('express'),     mongoStore = require('connect-mongo')(express),     flash = require('connect-flash'),     helpers = require('view-helpers');  module.exports = function (app, config, passport) {     app.set('showStackError', true);     // should be placed before express.static     app.use(express.compress({         filter: function (req, res) {             return /json|text|javascript|css/.test(res.getHeader('Content-Type'));         },         level: 9     }));     app.use(express.favicon());     app.use(express.static(config.root + '/public'));      app.use(express.logger('dev'));      // set views path, template engine and default layout     app.set('views', config.root + '/app/views');     app.set('view engine', 'jade');      app.configure(function () {         // use passport session         app.use(passport.initialize());         app.use(passport.session());          // dynamic helpers         app.use(helpers(config.app.name));          // cookieParser should be above session         app.use(express.cookieParser());          // bodyParser should be above methodOverride         app.use(express.bodyParser());         app.use(express.methodOverride());          // express/mongo session storage         app.use(express.session({             secret: 'linkit',             store: new mongoStore({                 url: config.db,                 collection : 'sessions'             })         }));          // connect flash for flash messages         app.use(flash());          // routes should be at the last         app.use(app.router);          // assume "not found" in the error msgs         // is a 404. this is somewhat silly, but         // valid, you can do whatever you like, set         // properties, use instanceof etc.         app.use(function(err, req, res, next){             // treat as 404             if (~err.message.indexOf('not found')) {                 return next();             }              // log it             console.error(err.stack);              // error page             res.status(500).render('500', { error: err.stack });         });          // assume 404 since no middleware responded         app.use(function(req, res, next){             res.status(404).render('404', {                 url: req.originalUrl,                 error: 'Not found'             });         });     }); }; 

What is wrong?

UPDATE According to @Peter Lyons I have changed the configurations order to the following, but I still got the same error:

var express = require('express'),     mongoStore = require('connect-mongo')(express),     flash = require('connect-flash'),     helpers = require('view-helpers');  module.exports = function (app, config, passport) {     app.set('showStackError', true);     // should be placed before express.static     app.use(express.compress({         filter: function (req, res) {             return /json|text|javascript|css/.test(res.getHeader('Content-Type'));         },         level: 9     }));     app.use(express.favicon());     app.use(express.static(config.root + '/public'));      app.use(express.logger('dev'));      // set views path, template engine and default layout     app.set('views', config.root + '/app/views');     app.set('view engine', 'jade');      app.configure(function () {          // dynamic helpers         app.use(helpers(config.app.name));          // cookieParser should be above session         app.use(express.cookieParser());          // bodyParser should be above methodOverride         app.use(express.bodyParser());         app.use(express.methodOverride());          // express/mongo session storage         app.use(express.session({             secret: 'linkit',             store: new mongoStore({                 url: config.db,                 collection : 'sessions'             })         }));          // connect flash for flash messages         app.use(flash());          // use passport session         app.use(passport.initialize());         app.use(passport.session());          // routes should be at the last         app.use(app.router);          // assume "not found" in the error msgs         // is a 404. this is somewhat silly, but         // valid, you can do whatever you like, set         // properties, use instanceof etc.         app.use(function(err, req, res, next){             // treat as 404             if (~err.message.indexOf('not found')) {                 return next();             }              // log it             console.error(err.stack);              // error page             res.status(500).render('500', { error: err.stack });         });          // assume 404 since no middleware responded         app.use(function(req, res, next){             res.status(404).render('404', {                 url: req.originalUrl,                 error: 'Not found'             });         });     }); }; 

回答1:

Follow the example to avoid the out-of-order middleware hell that express makes it so easy to enter. Straight from the docs. Note how yours does not match this exactly.

var app = express(); app.use(require('serve-static')(__dirname + '/../../public')); app.use(require('cookie-parser')()); app.use(require('body-parser').urlencoded({ extended: true })); app.use(require('express-session')({   secret: 'keyboard cat',   resave: true,   saveUninitialized: true })); app.use(passport.initialize()); app.use(passport.session()); 

Docs

  1. cookieParser
  2. session
  3. passport.initialize
  4. passport.session
  5. app.router

You

  1. passport.initialize
  2. passport.session
  3. cookieParser
  4. session
  5. app.router


回答2:

In my case (same error message) I've forgotten to add the passport initializations at all:

app.configure(function () {     ...     app.use(passport.initialize());     app.use(passport.session()); }); 

UPDATE: Only working up to express version 3, version 4 does not support app.configure() anymore



回答3:

Peter Lyons answer helped me to solve it, but i solved it in abit different way.

app.use(   cookieSession({     maxAge: 30 * 24 * 60 * 60 * 1000,     keys: [keys.cookieKey],   }), ); app.use(passport.initialize()); app.use(passport.session()); 

Have a look at my GitHub repo for the whole code and not only the code snippet here.



回答4:

In my case the error was because I was trying to promisify req.login without binding this to req, so when the function was called it could not find passport settings. The solution is binding req.login.bind(req) before passing it to promisify if you are using Node v8.



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!