1
votes

I am trying to create passport-local sign-up functionality, but whenever I try to hit auth/signup API, I always redirect to failure path i.e. failureRedirect: '/auth/failure'.

The code seems fine to me.

app.js:

var passport = require('passport');
var api = require('./routes/api');
var authenticate = require('./routes/authenticate')(passport);
require('./models/models');
var mongoose = require('mongoose');
mongoose.connect("mongodb://localhost:27017/test-chirp");
var app = express();

app.use('/auth', authenticate);

//// Initialize Passport
var initPassport = require('./passport-init');
initPassport(passport);

authenticate.js:

var express = require('express');
var router = express.Router();

module.exports = function(passport){

    //sends successful login state back to angular
    router.get('/success', function(req, res){
        res.send({state: 'success', user: req.user ? req.user : null});
    });

    //sends failure login state back to angular
    router.get('/failure', function(req, res){
        res.send({state: 'failure', user: null, message: "Invalid username or password"});
    });

    //sign up
    router.post('/signup', passport.authenticate('signup', {
        successRedirect: '/auth/success',
        failureRedirect: '/auth/failure'
    }));

    return router;
}

passport-init.js:

var mongoose = require('mongoose');
var User = mongoose.model('User');
var LocalStrategy = require('passport-local').Strategy;
var bCrypt = require('bcrypt-nodejs');

module.exports = function (passport) {
    passport.serializeUser(function (user, done) {
        //return the unique id for the user
        return done(null, user._id);
    });

    passport.deserializeUser(function (username, done) {
        User.findById(id, function (err, user) {
            if (err) { return done(err, false); }
            if (!user) { return done('user not found', false); }
            return done(user, true);
        })
    });



    passport.use('signup', new LocalStrategy({
        passReqToCallback: true
    },
        function (req, username, password, done) {
            // find a user in mongo with provided username
            User.findOne({ 'username': username }, function (err, user) {
                if (err) {return done(err);}
                // already exists
                if (user) {return done(null, false);} 
                else {
                    // if there is no user, create the user
                    var newUser = new User();

                    // set the user's local credentials
                    newUser.username = username;
                    newUser.password = createHash(password);

                    // save the user
                    newUser.save(function (err) {
                        if (err) {throw err;}
                        console.log(newUser.username + ' Registration succesful');
                        return done(null, newUser);
                    });
                }
            });
        })
    );

    var isValidPassword = function (user, password) {
        return bCrypt.compareSync(password, user.password);
    };
    // Generates hash using bCrypt
    var createHash = function (password) {
        return bCrypt.hashSync(password, bCrypt.genSaltSync(10), null);
    };
};

enter image description here enter image description here enter image description here

1
are you getting any error? and are you getting proper value of username and password? - abdulbarik
@abdulbarik: No there are no errors - Saurabh Palatkar
are you getting username and password? - abdulbarik
The problem here is: when I try to debug I never reach inside "passport.use('signup', new LocalStrategy..." debugger directly hits "router.get('/failure'..", so not sure if username password posted or not. - Saurabh Palatkar

1 Answers

0
votes
var app = express();

app.use('/auth', authenticate);

//// Initialize Passport
var initPassport = require('./passport-init');
initPassport(passport);

You are routing to the path /auth before initializing passport.

Try to switch :

var app = express();

//// Initialize Passport
var initPassport = require('./passport-init');
initPassport(passport);

app.use('/auth', authenticate);