passport.js le passeport.initialize() middleware ne l'utilisez pas
Je suis l'aide d'un noeud avec express + mangouste et d'essayer de les utiliser passport.js avec les api restful.
Je reçois cette exception après l'authentification de succès (je vois l'url de callback sur le navigateur):
/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
J'ai lu que je devrais mettre app.use(passport.initialize());
et app.use(passport.session());
avant app.use(app.router);
et c'est ce que j'ai fait. Voici mon express.js qui enregistre les 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'
});
});
});
};
Quel est le problème?
Mise à JOUR
Selon Peter @Lyon, j'ai changé les configurations pour la suite, mais j'ai toujours le même message d'erreur:
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'
});
});
});
};
- Express 4.x versions ne sont pas compatibles avec certaines méthodes. Voir github.com/strongloop/express/wiki/Migrating-from-3.x-to-4.x
Vous devez vous connecter pour publier un commentaire.
Suivre l'exemple d'éviter l'out-of-order middleware de l'enfer qui expriment le rend si facile à saisir. Directement à partir de la documentation. Notez comment la vôtre ne correspond pas exactement.
Docs
app.get
,app.post
, etc? Ceux-ci vont provoquer le routeur d'être ajoutées à la pile plus tôt que vous le souhaitez. Nous montrer TOUTES les conditions du code de départ lorsque vous appelez laexpress()
fonction pour obtenir votreapp
objet. C'est mon 2ème deviner.Dans mon cas (même message d'erreur) j'ai oublié d'ajouter le passeport initialisations à tous:
Mise à JOUR: Seulement jusqu'à l'express de la version 3 à la version 4 ne prend pas en charge l'application.configurer() plus
Dans mon cas, l'erreur était parce que j'essayais de promisify
req.login
sans liaisonthis
àreq
, de sorte que lorsque la fonction a été appelée il ne pouvait pas trouverpassport
paramètres.La solution est contraignante
req.login.bind(req)
avant de passer àpromisify
si vous êtes à l'aide d'un Noeud v8.function({ login })
passage de lareq
comme premier argument. Votre solution a fonctionné pour moi, mercithis
fonctionne en Javascript. Si vous ne faites pas appel de la fonction en tant que méthode de l'objet puisthis
seraundefined
( ouwindow
dans le navigateur)Function.prototype.call
,Function.prototype.apply
, commentthis
fonctionne en Javascript et les principes qui sous-tendent l'héritage par prototype, vous ferez la promotion au niveau de Javascript Gourou dans le processus 🙂util.promisify(req.login.bind(req));
Peter Lyons réponse m'a aidé à le résoudre, mais je l'ai résolu en abit de manière différente.
Jeter un oeil à mon Dépôt GitHub pour l'ensemble du code et pas seulement l'extrait de code ici.
Ce qui m'a aidé aussi c'était de mettre routes APRÈS cookies config:
Dans mon cas (même message d'erreur), j'ai été l'élaboration d'une stratégie personnalisée et je n'avez pas besoin d'utiliser une session. J'ai juste oublié d'ajouter
session: false
dans mon itinéraireauthenticate
middleware.