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 ??
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. –
Ho modificato la domanda, ho aggiunto i miei metodi di serializzazione e deserializzazione alla fine della domanda. Grazie per la risposta! –
Ho notato anche che l'oggetto "utente" inviato al metodo deserialize sulla richiesta successiva è "null"! –