passport’s req.isAuthenticated restituisce sempre false, anche quando eseguo hardcode (null, true)

Sto cercando di far funzionare la mia strategia locale Passport.

Ho creato questo middleware:

passport.use(new LocalStrategy(function(username, password, done) { //return done(null, user); if (username=='ben' && password=='benny'){ console.log("Password correct"); return done(null, true); } else return done(null, false, {message: "Incorrect Login"}); })); 

ma poi qui

 app.use('/admin', adminIsLoggedIn, admin); function adminIsLoggedIn(req, res, next) { // if user is authenticated in the session, carry on if (req.isAuthenticated()) return next(); // if they aren't redirect them to the home page res.redirect('/'); } 

fallisce sempre e reindirizza alla home page.

Non riesco a capire perché questo sta accadendo? Perché non autentica?

Nella mia console vedo che sta Password Correct . Perché non funzionerà?

Ho avuto un problema simile. Potrebbe essere dovuto al middleware di sessione rapida necessario per il passaporto. Riparato usando i middleware nel seguente ordine: (Express 4)

 var session = require('express-session'); // required for passport session app.use(session({ secret: 'secrettexthere', saveUninitialized: true, resave: true, // using store session on MongoDB using express-session + connect store: new MongoStore({ url: config.urlMongo, collection: 'sessions' }) })); // Init passport authentication app.use(passport.initialize()); // persistent login sessions app.use(passport.session()); 

Questo potrebbe anche essere un problema con le chiamate POST / GET del tuo cliente. Ho avuto questo stesso identico problema, ma ho scoperto che dovevo dare fetch (che è quello che stavo usando) le credentials:'include' opzioni credentials:'include' modo:

 fetch('/...', { method: 'POST', headers: myHeaders, credentials: 'include', body: ... ...}) 

Il motivo è perché fetch non supporta il passaggio di cookie, che è necessario in questo caso.

PER I NUOVI

Stavo affrontando un problema simile, in cui la mia funzione isAuthenticated () restituirebbe false. Ho perso molto tempo, spero che questa risposta salvi la tua.

Alcuni problemi comuni a cui prestare attenzione,

  1. Ordine di installazione del middleware (express-session> pass.initialize> pass.session) (e mentre lo fai CONTROLLA LA TUA SINTASSI).
  2. I metodi Serialize e Deserialize devono passare all’utente sulla richiesta. (Per maggiori informazioni ho postato una risposta su questo link .. Nozioni di base su Passport Session (expressjs) -perché è necessario serializzare e deserializzare? ) Se non ci sono utenti su richiesta quindi isAuthenticated restituisce false …. e reindirizza al PERCORSO definito …… quando falso …. E … ANCORA UNA VOLTA ….. CONTROLLA LA TUA SINTASSI.
  3. La funzione getUserById o findById definita nel modello (user.js) deve avere una funzione User.findById (e non User.findOne Again CHECK YOUR .. WAIT FOR IT..SYNTAX) definita (questa funzione dovrebbe caricare l’utente sul richiesta in ogni sessione)

Ho avuto lo stesso problema dimenticando di aggiungere

 request.login() 

sopra

 app.post('/login', function(request, response, next) { console.log(request.session) passport.authenticate('login', function(err, user, info) { if(!user){ response.send(info.message);} else{ request.login(user, function(error) { if (error) return next(error); console.log("Request Login supossedly successful."); return response.send('Login successful'); }); //response.send('Login successful'); } })(request, response, next); } ); 

Spero che questo possa aiutare gli altri che sono finiti qui per la stessa ragione che ho avuto io.

Il mio problema è stato quello di impostare cookie.secure su true anche se i dati non erano superiori a https.

 app.use(require('express-session')({ secret: process.env.sessionSecret, cookie: { maxAge: 1000 * 60 * 60 * 24 * 7 // 1 week }, store: store, resave: false, saveUninitialized: false, cookie: { secure: false } // Remember to set this })); 

Ricorda di impostare i cookie su false se non stai utilizzando https

 cookie: { secure: false } // Set to false 

Inoltre, se credi di avere https ricorda di fidarti del proxy

 app.set('trust proxy', 1) // trust first proxy 

Ho risolto questo problema risolvendo il mio passport.deserializeUser . Sto usando mongo nativo e dal momento che la maggior parte degli esempi usa Mongoose sono caduto nella trappola _id ancora una volta.

Quindi ricorda di rendere _id un ObjectID mongo quando leggi l’utente in deserializeUser

 passport.deserializeUser(function(user, done) { const collection = db.get().collection('users') const userId = new mongo.ObjectID(user); collection.findOne({_id : userId}, function(err, user) { if (err) done(err, null); done(null, user); }); }); 

La mia query non è stata trovata dall’utente poiché non ho reso l’id un ObjectID e non sono stati indicati errori in nessun luogo.

Se avvolgi i tuoi percorsi in questo modo:

 module.exports = function(){ router.get('/',(req,res)=>{ res.send('stuff'); } } 

Devi passare “app e passaporto” ai tuoi percorsi in questo modo:

 module.exports = function(app,passport){ //routes n stuff } 

Usa l’autenticazione nel modo seguente, funzionerà di sicuro in quanto il passaporto richiede che la sessione esplicita funzioni correttamente

 //======================================installation of utilities======================================// var express = require("express"), app = express(), bodyParser = require("body-parser"), mongoose = require("mongoose"), Campsite = require("./models/campsite"), override = require("method-override"), Comments = require("./models/comments"), seedDB = require("./seed"), User = require("./models/user.js"), passport = require("passport"), passportlocal = require("passport-local"), passportmongoose = require("passport-local-mongoose") //======================================uitilities setup ==============================================// app.use(override("_method")) app.use(bodyParser.urlencoded({ extended: true })) app.set("view engine","ejs") seedDB() app.use(require("express-session")({ secret:"random text input", resave:false, saveUninitialized:false })) app.use(passport.initialize()) app.use(passport.session()) passport.use(new passportlocal(User.authenticate())) passport.serializeUser(User.serializeUser()) passport.deserializeUser(User.deserializeUser()) mongoose.connect("mongodb://localhost/yelpCamp") app.use(function(req, res, next){ res.locals.currentUser = req.user; next(); }); 

Anch’io stavo affrontando lo stesso problema, ma @PVThomas mi dà una soluzione, come in qui in Answers. Il mio problema era con il metodo findById() in deserialize() . Stavo usando findOne() in findById() e poi l’ho sostituito con find() e ora req.isAuthenticated() funziona bene. La mia app non stava salvando req.session.passport.user , restituiva undefined e dopo la sostituzione di findOne() con find() sta salvando l’id utente in req.session.passport.user .