Acceso al pasaporte y sesión persistente
Tengo una aplicación MEAN con capacidades CRUD totalmente probada con cartero. He estado tratando de persistir el inicio de sesión desde hace bastante tiempo sin suerte. He leído y probado lo siguiente
documentos de pasaporteblog de toon io sobre inicio de sesiónSesión expressScotch io, autenticación de nodo facilitadaAdemás de un montón de otros materiales de lectura livianos (Muchas preguntas SO)Pero solo he podido registrar e iniciar sesión en un usuario, no persistir el inicio de sesión con una sesión.
Mi aplicaciónaquí es un enlace al repositorio completo de github (si está buscando los últimos cambios, consulte la rama de desarrollo)
Mi comprensión de la autenticación / inicio de sesiónAquí entiendo el inicio de sesión del usuario con ejemplos de código de mi proyecto y la captura de pantalla de los resultados del cartero, así como los registros de la consola.
Configuración de pasaporteTengo el siguiente archivo auth.js, configura el pasaporte
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
module.exports = function(app, user){
app.use(passport.initialize());
app.use(passport.session());
// passport config
passport.use(new LocalStrategy(user.authenticate()));
passport.serializeUser(function(user, done) {
console.log('serializing user: ');
console.log(user);
done(null, user._id);
});
passport.deserializeUser(function(id, done) {
user.findById(id, function(err, user) {
console.log('no im not serial');
done(err, user);
});
});
};
Esto se llama en el archivo del servidor como
//code before
var user = require('./models/user.js');
var auth = require('./modules/auth.js')(app, user);
// code after
Enrutamiento para iniciar sesiónEn mis rutas tengo la ruta de inicio de sesión de la siguiente manera
router.post('/login', function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
if (err) {
return next(err);
}
if (!user) {
return res.status(401).json({
err: info
});
}
req.logIn(user, function(err) {
if (err) {
return res.status(500).json({
err: 'Could not log in user'
});
}
res.status(200).json({
status: 'Login successful!'
});
});
})(req, res, next);
});
Esta rutatrabajos según lo probado con cartero. Entro en los detalles 'joe' y 'pass' y obtengo la siguiente respuesta.
Cuando se alcanza esta ruta, también podemos ver en la consola que el usuario está serializado.
Entonces, ¿qué sigue?Aquí es donde me pierdo. Tengo algunas preguntas.
¿El usuario está ahora en una sesión en mi servidor?¿Debo enviar elreq.session.passport.user
de vuelta al cliente?¿Necesito el ID de sesión en todas las solicitudes futuras?Probar la sesiónTengo una segunda configuración de ruta para probar la sesión, es la siguiente
router.get('/checkauth', passport.authenticate('local'), function(req, res){
res.status(200).json({
status: 'Login successful!'
});
});
La partepassport.authenticate('local')
(Pensé) está allí para probar si la sesión del usuario existe antes de dar acceso a la ruta, pero nunca obtengo una respuesta 200 cuando ejecuto esto, incluso después de iniciar sesión.
¿Esta ruta espera unreq.session.passport.user
pasado en la cabeza o como argumento de datos en una solicitud http que requiere autenticación?
Si me perdí algo o estoy entendiendo algo mal, por favor dígame, cualquier comentario es apreciado. Gracias a todos.