J'essaie d'établir un mécanisme de connexion en utilisant node.js, express et passport.js. La connexion elle-même fonctionne assez bien, les sessions sont également bien stockées avec redis mais j'ai quelques problèmes pour rediriger l'utilisateur vers l'endroit où il a commencé avant d'être invité à s'authentifier.
Par exemple, l'utilisateur suit le lien http://localhost:3000/hidden
est ensuite redirigé vers, http://localhost:3000/login
mais je veux qu'il soit redirigé vers http://localhost:3000/hidden
.
Le but de ceci est que si l'utilisateur accède de manière aléatoire à une page à laquelle il doit d'abord se connecter, il sera redirigé vers le site / login en fournissant ses informations d'identification, puis redirigé vers le site auquel il a précédemment tenté d'accéder.
Voici mon post de connexion
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);
});
et ici ma méthode ensureAuthenticated
function ensureAuthenticated (req, res, next) {
if (req.isAuthenticated()) {
return next();
}
res.redirect('/login');
}
qui s'accroche à la /hidden
page
app.get('/hidden', ensureAuthenticated, function(req, res){
res.render('hidden', { title: 'hidden page' });
});
La sortie html pour le site de connexion est assez 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>
Réponses:
Je ne sais pas pour le passeport, mais voici comment procéder:
J'ai un middleware que j'utilise avec
app.get('/account', auth.restrict, routes.account)
qui définitredirectTo
dans la session ... puis je redirige vers / loginEnsuite,
routes.login.post
je fais ce qui suit:la source
req.session.redirect_to = req.path
req.session.redirect_to = req.path
dans votre middleware d'authentification. Ensuite, lisez-le et supprimez-le dans lalogin.post
route.Dans votre
ensureAuthenticated
méthode, enregistrez l'url de retour dans la session comme ceci:Ensuite, vous pouvez mettre à jour votre passeport.authentifier l'itinéraire vers quelque chose comme:
la source
req.session.returnTo = null;
Voir cette question pour plus d'informations sur la déconnexion par défaut du passeport, qui, à l'examen de la source, semble effacer uniquement la session.user, et non la session entière.req.path
cela, j'utiliseraisreq.originalUrl
car c'est une combinaison de baseUrl et de chemin, voir la documentationJetez un œil à connect-ensure-login , qui fonctionne avec Passport pour faire exactement ce que vous voulez!
la source
Ma façon de faire:
Contrôleur GET / login :
Contrôleur POST / login :
Contrôleur POST / déconnexion (pas sûr s'il y a 100% ok, les commentaires sont les bienvenus):
Clear returnTo middleware (efface returnTo de la session sur n'importe quelle route sauf les routes d'authentification - pour moi, il s'agit de / login et / auth /: provider):
Cette approche a deux caractéristiques :
la source
Si vous utilisez connect-ensure-login, il existe un moyen intégré très simple de le faire avec Passport en utilisant le
successReturnToOrRedirect
paramètre. Lorsqu'il est utilisé, le passeport vous renverra à l'URL demandée à l'origine ou à l'URL que vous fournissez.https://github.com/jaredhanson/connect-ensure-login#log-in-and-return-to
la source
Les réponses @chovy et @linuxdan ont un bogue avec le non-effacement
session.returnTo
si l'utilisateur va à une autre page après la redirection de connexion (cela ne nécessite pas d'authentification) et se connecte par là. Ajoutez donc ce code à leurs implémentations:Si vous effectuez des requêtes ajax depuis la page de connexion, vous pouvez également les exclure.
Une autre approche consiste à utiliser le flash dans
ensureAuthenticated
Et puis dans GET login
Dans la vue, ajoutez un champ caché au formulaire de connexion (exemple en jade)
Dans la connexion POST
Notez que redirectTo s'effacera après la première connexion GET avec lui.
la source
Le moyen le plus simple (et correctement) d'y parvenir est le réglage
failureRedirect
et lessuccessRedirect
options .la source
successRedirect
être utilisé sur l'itinéraire de retour, mais la destination prévue (c'estreturnTo
-à- dire ci - dessus) serait perdue, non?