8

Dopo il primo accesso riuscito da Facebook e la richiamata di reindirizzamento dell'accesso utilizzando passport-facebook 1.0.3 ed express 4.6. 1, req.session.passport e req.user contengono il valore impostato durante la chiamata serialize (che ottengo dalla stragegy), ma nelle successive visite a percorsi diversi sul sito il req.session.passport e req.user è vuoto e req.isAuthenticated() restituisce false, quindi dopo il primo accesso riuscito da parte di FB, il metodo sureAuthentication su tutti gli altri percorsi non riesce. Non sto usando una configurazione cluster, quindi credo che il negozio di memoria è sufficiente per gestire questa situazione, la configurazione espresso guarda bene (intendo l'ordine), qui è la mia configurazione espressoreq.session.passport e req.user vuoti e req.isAuthenticated restituisce false dopo il login iniziale riuscito utilizzando passport-facebook

configExpressApp.set('views', './views'); 
configExpressApp.set('view engine', 'jade'); 
configExpressApp.use(morgan('dev')); 
configExpressApp.use(cookieParser()); 
configExpressApp.use(bodyParser.urlencoded({ 
    extended: true, 
})); 
configExpressApp.use(bodyParser.json()); 
configExpressApp.use(expressSession({ 
    secret:'MyExpressSecret', 
    saveUninitialized: true, 
    resave: true 
})); 
configExpressApp.use(passport.initialize()); 
configExpressApp.use(passport.session()); 
configExpressApp.use(methodOverride()); 
configExpressApp.use(express.static('./public')); 

Ecco il req oggetto .session sul login successo iniziale e il reindirizzamento, il req.user contiene gli stessi dati del req.session.passport.user

{ cookie: 
    { path: '/', 
    _expires: null, 
    originalMaxAge: null, 
    httpOnly: true }, 
    passport: 
    { user: 
     { _id: 53ce23e3121421f229a438f8, 
     info: false, 
     loginType: 'fb', 
     fbId: 'MyId', 
     name: 'Karthic Rao', 
     email: '[email protected]' 

     } 
    } 
} 

questa è l'informazione ho associato in precedenza con il richiamo fatto() all'interno della strategia e anche all'interno della chiamata di serializzazione. Dopo il login e il callback eseguiti con successo, utilizzo res.redirect per reindirizzare l'utente a un percorso diverso, ma le richieste provenienti da quella rotta contengono il sessionID (quindi non penso che sia il problema con l'archivio delle sessioni), ma il req.user il campo non esiste (può essere perché i media passport.initialize() e passport.session() non trovano la richiesta da autenticare) e il campo req.session.passport è vuoto, qui ci sono i dettagli dal console.log del req oggetto.

sessionID: 'I9R1c3PIYgDW5OpWbNT7qb02Hn4lOeAB', 
session: 
    { cookie: 
     { path: '/', 
     _expires: null, 
     originalMaxAge: null, 
     httpOnly: true }, 
    passport: {} }, 

Ecco il mio metodo deserialize

passport.deserializeUser(function(user, done) { 
    console.log('deserialize loginType facebook'); 
    db.collection("users").findOne({ 
     fbId: user.id 
    }, function(err, docs) { 
     console.log(docs); 
     done(err, docs); 
    }); 
}); 

Ecco il mio metodo Serialize

passport.serializeUser(function (user, done) { 
    console.log(user); 
    done(null, user); 
}); 

Questo sta creando un grande ostacolo per il mio sviluppo, come posso risolvere questo problema ??

+0

Hmmm ... Non ho soluzioni immediate per suggerirti, ma potresti mostrarci i metodi 'serializeUser' e' deserializeUser'? Per me, sembra che tutto ciò che è memorizzato nella sessione non sia deserializzato correttamente. –

+0

Ho modificato la domanda, ho aggiunto i miei metodi di serializzazione e deserializzazione alla fine della domanda. Grazie per la risposta! –

+0

Ho notato anche che l'oggetto "utente" inviato al metodo deserialize sulla richiesta successiva è "null"! –

risposta

9

Bene, se si potesse aggiungere il codice in cui si utilizza la strategia (dovrebbe essere nel middleware), ciò ci darebbe una visione completa del problema, perché è necessario sapere quale oggetto viene inviato a serializeUser.

(molto) in pratica, quando un utente tenta di eseguire l'autenticazione, le cose accadono in questo modo:

  • Passaporto tenta di autenticare l'utente contro server di Facebook
  • Se riesce, la funzione di callback (o successRedirect) viene chiamato con un oggetto contenente i dettagli dell'utente
  • Poi, passaporto effettua una chiamata a req.login per memorizzare alcune informazioni circa l'utente in sessione
  • Poi 012.viene richiamato e memorizza efficacemente i dati specificati nella sessione.

MA dal codice che hai postato, ho il sospetto che nel vostro deserializeUser, utente.L'ID non è definito, poiché l'oggetto user memorizzato nella sessione utilizza un campo ID chiamato _id e non id.

Se si cambia

db.collection("users").findOne({ 
     fbId: user.id 

a

db.collection("users").findOne({ 
     fbId: user._id 

db.collection("users").findById(user._id, [fields],[options],[callback]); 

penso che dovrebbe funzionare.

EDIT: ho modificato la mia risposta in base all'osservazione di @ BrandonZacharie, che ha rilevato un errore nel mio codice.

+0

Non dovrebbe essere "... findOne ({fbId: user.fbId} ..." o "... findOne ({_id: mongodb.ObjectId (user._id)} ..." invece? –

+0

@ BrandonZacharie Ho riletto il tuo commento (e cancellato il mio precedente, poiché era sbagliato). Penso che tu abbia ragione: ho semplicemente copiato il codice di Karthic Rao senza prestare attenzione, anche Mango ha un metodo [findById] (http://mongoosejs.com/docs/api.html#model_Model.findById) che accetta un "objectid, o un valore che può essere castato in uno" come primo parametro. Modificherò la mia risposta in base al tuo suggerimento se è ok con te (o potresti postare il tuo commento come risposta) –

+1

Sì, il file _id che viene indicato come id era sicuramente uno dei problemi, ma l'altro problema era che stavo usando requirejs al backend per modularizzare e i codici nodejs, io ha fatto un errore nell'usare un oggetto passaporto diverso per la configurazione come middleware (passport.session() e passaporto .initialize()) e avevo chiamato serializeUser e deserializeUser su un oggetto passaporto diverso. Funziona ora, grazie per tutti i tuoi sforzi nell'aiutarmi! –

Problemi correlati