2015-03-17 8 views
30

Sto provando a far funzionare la mia strategia locale Passport.richiesta del passaporto.autenticato sempre restituendo false, anche quando ho eseguito l'hardcode (null, true)

Ho questo middleware configurare:

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('/'); 
} 

viene a mancare sempre e reindirizza alla home page.

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

Nella mia console posso vedere che è Password Correct sta stampando. Perché non funziona?

risposta

35

Ho avuto un problema simile. Potrebbe essere dovuto al middleware di sessione rapida necessario per il passaporto. Risolto esso utilizzando 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()); 
+0

Sto anche affrontando lo stesso problema ... ma non riesco a ottenere la soluzione – Nodemon

+3

ho già fatto quello che hai detto sopra..ma ancora sto affrontando il problema – Nodemon

+8

il mio problema era che stavo chiamando 'passport.use, serializeUser, deserializeUser 'ma non stavo chiamando' app.use (passport.initialize()); ' e 'app.use (passport.session());' prima di quello – osmingo

2

Ho avuto lo stesso problema dimenticando di aggiungere

request.login() 

su

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); 
    } 
); 

Speriamo che potrebbe aiutare per altri che sono finiti qui la stessa ragione di me.

+0

In passport.authenticaticate l'utente sta arrivando false e info come credenziali mancanti. puoi sapere l'errore. si prega di fare riferimento alla mia domanda per la spiegazione http://stackoverflow.com/questions/42898027/passport-js-local-strategy-custom-callback-showing-user-as-false-and-info-as-mi –

+0

@ OE1, grazie tu. Mi hai salvato. – Vikram

+2

Nota: il middleware passport.authenticate() richiama automaticamente req.login(). Questa funzione viene principalmente utilizzata quando gli utenti si registrano, durante il quale req.login() può essere richiamato per accedere automaticamente all'utente appena registrato. – Epirocks

6

Questo potrebbe anche essere un problema con le chiamate POST/GET del client. Ho avuto questo stesso problema esatta, ma si è scoperto che ho dovuto dare fetch (che è quello che stavo usando) l'opzione credentials:'include' in questo modo:

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

Il motivo è dovuto al fatto prendere non supporta il passaggio verso il basso i biscotti, che è necessario in questo caso.

5

per i principianti

stavo affrontando un problema simile, dove la mia funzione isAuthenticated() restituirebbe false.I perso un sacco di tempo, spero questa risposta salva la tua.

alcuni problemi comuni a cui fare attenzione,

  1. Middleware ordine di installazione (esprimere-session> pass.initialize> pass.session) (e mentre lo fai controllare il tuo sintassi).
  2. I metodi di serializzazione e deserializzazione devono passare all'utente sulla richiesta. (Per maggiori informazioni ho postato una risposta su questo link .. Basics of Passport Session (expressjs)-why do we need to serialize and deserialize?) se non ci sono utenti su richiesta allora isAuthenticated restituirebbe falso .... e reindirizzare a il PERCORSO definito ...... quando falso .... E ... ANCORA UNA VOLTA ..... CONTROLLA LA TUA SINTASSI.
  3. Il getUserById o findById funzione definita nelle modello (user.js) deve avere un User.findById (e non User.findOne Anche in questo caso VERIFICARE .. ASPETTARE IT..SYNTAX) funzione definita. (questa funzione sarebbe caricare l'utente in merito alla richiesta in ogni sessione)
0

ho risolto questo problema fissando 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 ricordatevi di fare il _id un mongo IDOggetto durante la lettura 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 domanda non era trovare l'utente dal momento che non ho fatto l'id di un'ObjectID, e non v'è stato nessun errore indicato da nessuna parte .

Problemi correlati