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

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

问题:

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.



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