3
votes

I have a Passport js local signup strategy that makes use of the successRedirect and failureRedirect methods. The problem is, if there is an error with the signup process, Passport will simply redirect back to the signup form, with no data in the form.

app.post('/signup', passport.authenticate('local-signup', {
        successRedirect: '/signup/avatar', // redirect to the secure profile section
        failureRedirect: '/signup', // redirect back to the signup page if there is an error
        failureFlash: true // allow flash messages
    }));

I have the following condition inside my local signup strategy that will send a failure message to the user if the two provided passwords do not match.

if(req.body.password != req.body.confirm_password){
                                console.log('Passwords do not match');
                                return done(null, false, req.flash('signupMessage', 'Your passwords do not match'));
                            }

Along with the flash message, I want to send data back to the /signup route and re-populate the form with the data the user has provided.

Is there a way to send the form data back to the browser on failure?

2
Why do you want to send the data again (i.e. the error message) when you're already populating the req.flash instance? You just need to referenced the req.flash content in whatever you're using for your view. - Ben
The flash message is working. The problem is, the user will have to fill out the whole form again, just because they got one input wrong. I want to send the data back to the view so I can populate the form for them with all the data they sent, minus the part that was incorrect. - Tom
Please check my answer in below link. Hope that will help. stackoverflow.com/questions/13598837/… - kanna

2 Answers

2
votes

The answer was much simpler than I expected.

The validation should happen before the data is sent to Passport js, then if the data is not valid, the /signup template can be re-rendered and the data passed back.

The solution was in this question: NodeJS express-validator with passport

1
votes

Sorry, after our comments I understand what you're asking a little better now. You need to make use of a custom callback in your passport code. The passport site gives this example:

app.get('/login', function(req, res, next) {
  passport.authenticate('local', function(err, user, info) {
    if (err) { return next(err); }
    if (!user) { return res.redirect('/login'); }
    req.logIn(user, function(err) {
      if (err) { return next(err); }
      return res.redirect('/users/' + user.username);
    });
  })(req, res, next);
});

Through a closure here, your callback has access to both the request and the response, so when you deal with your error state, you can invoke code to update the response from the originating request (e.g. pulling in the specified username or whatever it is you wish to re-populate the sign-up screen with).

http://passportjs.org/docs/authenticate