Estoy tratando de establecer un mecanismo de inicio de sesión usando node.js, express y passport.js. El inicio de sesión en sí funciona bastante bien, también las sesiones se almacenan bien con redis, pero tengo algunos problemas para redirigir al usuario a donde comenzó antes de que se le solicite que se autentique.
por ejemplo, el usuario sigue el enlace y http://localhost:3000/hidden
luego es redirigido a, http://localhost:3000/login
pero luego quiero que sea redirigido nuevamente a http://localhost:3000/hidden
.
El propósito de esto es que, si el usuario accede aleatoriamente a una página en la que necesita iniciar sesión primero, será redirigido al sitio / login proporcionando sus credenciales y luego será redirigido de nuevo al sitio al que intentó acceder anteriormente.
Aquí está mi publicación de inicio de sesión
app.post('/login', function (req, res, next) {
passport.authenticate('local', function (err, user, info) {
if (err) {
return next(err)
} else if (!user) {
console.log('message: ' + info.message);
return res.redirect('/login')
} else {
req.logIn(user, function (err) {
if (err) {
return next(err);
}
return next(); // <-? Is this line right?
});
}
})(req, res, next);
});
y aquí mi método asegurado
function ensureAuthenticated (req, res, next) {
if (req.isAuthenticated()) {
return next();
}
res.redirect('/login');
}
que se engancha en la /hidden
página
app.get('/hidden', ensureAuthenticated, function(req, res){
res.render('hidden', { title: 'hidden page' });
});
La salida html para el sitio de inicio de sesión es bastante simple
<form method="post" action="/login">
<div id="username">
<label>Username:</label>
<input type="text" value="bob" name="username">
</div>
<div id="password">
<label>Password:</label>
<input type="password" value="secret" name="password">
</div>
<div id="info"></div>
<div id="submit">
<input type="submit" value="submit">
</div>
</form>
Respuestas:
No sé sobre pasaporte, pero así es como lo hago:
Tengo un middleware que uso con
app.get('/account', auth.restrict, routes.account)
ese conjuntoredirectTo
en la sesión ... luego redirijo a / loginLuego
routes.login.post
, hago lo siguiente:fuente
req.session.redirect_to = req.path
req.session.redirect_to = req.path
dentro de su middleware de autenticación. Luego léelo y bórralo enlogin.post
ruta.En su
ensureAuthenticated
método, guarde la URL de retorno en la sesión de esta manera:Luego puede actualizar su ruta passport.authenticate a algo como:
fuente
req.session.returnTo = null;
Consulte esta pregunta para obtener información adicional sobre el cierre de sesión predeterminado del pasaporte, que, en el examen de la fuente, parece borrar solo el usuario de la sesión, y no toda la sesión.req.path
lo que usaría,req.originalUrl
ya que es una combinación de baseUrl y ruta, consulte la documentaciónEche un vistazo a connect-secure-login , que funciona junto con Passport para hacer exactamente lo que desea.
fuente
Mi forma de hacer las cosas:
GET / controlador de inicio de sesión :
POST / controlador de inicio de sesión :
POST / controlador de cierre de sesión (no estoy seguro de si está 100% correcto, los comentarios son bienvenidos):
Clear returnTo middleware (borra returnTo de la sesión en cualquier ruta, excepto en las rutas de autenticación; para mí son / login y / auth /: provider):
Este enfoque tiene dos características :
fuente
Si está utilizando connect -urance-login, existe una forma integrada y muy fácil de hacer esto con Passport utilizando el
successReturnToOrRedirect
parámetro. Cuando se usa, el pasaporte lo enviará de regreso a la URL solicitada originalmente o volverá a la URL que proporcionó.https://github.com/jaredhanson/connect-ensure-login#log-in-and-return-to
fuente
Las respuestas @chovy y @linuxdan tienen un error al no borrar
session.returnTo
si el usuario va a otra página después de la redirección de inicio de sesión (eso no requiere autenticación) e inicia sesión por allí. Así que agregue este código a sus implementaciones:Si realiza algunas solicitudes ajax desde la página de inicio de sesión, también puede excluirlas.
Otro enfoque es utilizar flash en
ensureAuthenticated
Y luego en GET iniciar sesión
En vista, agregue un campo oculto al formulario de inicio de sesión (ejemplo en jade)
En POST iniciar sesión
Tenga en cuenta que redirectTo se borrará después del primer inicio de sesión GET con él.
fuente
La forma más fácil (y adecuada) de lograr esto es la configuración
failureRedirect
y lassuccessRedirect
opciones .fuente
successRedirect
está utilizando en la ruta de regreso, pero luegoreturnTo
se perderá el destino previsto (es decir, arriba), ¿verdad?