116 votes

Redirection vers la page précédente après authentification dans node.js avec passeport

Je suis en train d'établir un mécanisme de connexion à l'aide de node.js, d'exprimer et de passeport. La Connexion fonctionne assez bien, aussi, les sessions sont stockées joliment avec le redis, mais j'ai quelques problèmes avec la redirection de l'utilisateur à l'endroit où il a commencé à partir avant d'être invité à vous authentifier.

par exemple, l'Utilisateur suit le lien http://localhost:3000/hidden est alors redirigé vers http://localhost:3000/login mais je veux lui pour être redirigé à nouveau de retour à l' http://localhost:3000/hidden.

Le but de cela est, si l'utilisateur l'accès au hasard d'une page, il doit être enregistré dans le premier, il sera redirigé vers le /login site en fournissant ses informations d'identification et d'être ensuite redirigé vers le site auparavant, il a essayé d'accès.

Voici mon login poste

app.post('/login', function(req, res, next){
passport.authenticate('local', function(err, user, info){

    if (err) { return next(err) }
    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 voici mon ensureAuthenticated Méthode

function ensureAuthenticated(req, res, next) {

  var isAuth = req.isAuthenticated();

  if (req.isAuthenticated()) { 
      return next(); 
  }
  res.redirect('/login');
}

qui s'accroche dans le /caché page

app.get('/hidden', ensureAuthenticated, function(req, res){

res.render('hidden', { title: 'hidden page' });


});

La sortie html pour la connexion du site 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>

126voto

linuxdan Points 401

Dans votre méthode ensureAuthenticated , enregistrez l'URL de retour dans la session comme suit:

 ...
request.session.returnTo = request.path; 
res.redirect('/login');
...
 

Ensuite, vous pouvez mettre à jour votre passeport.authentifier la route à quelque chose comme:

 app.get('/auth/google/return', passport.authenticate('google'), function(req, res) {
    res.redirect(request.session.returnTo || '/');
}); 
 

89voto

chovy Points 8012

Je ne connais pas le passeport, mais voici comment je le fais:

J'ai un middleware que j'utilise avec app.get('/account', auth.restrict, routes.account) qui définit redirect_to dans la session ... puis je redirige vers / login

 auth.restrict = function(req, res, next){
    if ( !req.session.userid ) {
        req.session.redirect_to = '/account';
            res.redirect('/login');
    } else {
        next();
    }
};
 

Puis en routes.login.post je fais ce qui suit:

 var redirect_to = req.session.redirect_to ? req.session.redirect_to : '/';
delete req.session.redirect_to;
//is authenticated ?
res.redirect(redirect_to);
 

17voto

Jared Hanson Points 8390

Jetez un coup d'œil à connect-assure-login , qui fonctionne avec Passport pour faire exactement ce que vous voulez!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X