Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

object Object error in signup with passport in express

I am using Passport and Express in a NodeJs project. I have a User model with fields: id, password, and email. When I try to signup it throws this error:

[object Object]

into the form and it doesn't post user data in the database. In the console, it shows

POST /signup 302 -58.

Here's whole passport.js file:

var LocalStrategy    = require('passport-local').Strategy;

// load up the user model
var configDB = require('./database.js');
var Sequelize = require('sequelize');
var sequelize = new Sequelize(configDB.url);

var User       = sequelize.import('../app/models/users');
User.sync();

// load the auth variables
var configAuth = require('./auth'); // use this one for testing

module.exports = function(passport) {

    // used to serialize the user for the session
    passport.serializeUser(function(user, done) {
        done(null, user.id);
    });

    // used to deserialize the user
    passport.deserializeUser(function(id, done) {
        User.findById(id).then(function(user){
            done(null, user);
        }).catch(function(e){
            done(e, false);
        });
        });
=========================================================================
        // LOCAL LOGIN =============================================================
    passport.use('local-login', new LocalStrategy({
        // by default, local strategy uses username and password, we will override with email
        usernameField : 'email',
        passwordField : 'password',
        passReqToCallback : true // allows us to pass in the req from our route (lets us check if a user is logged in or not)
    },
    function(req, email, password, done) {      
            User.findOne({ where: { email: email }})
                .then(function(user) {
                    if (!user) {
                        done(null, false, req.flash('loginMessage', 'Unknown user'));
                    } else if (!user.validPassword(password)) {
                        done(null, false, req.flash('loginMessage', 'Wrong password'));
                    } else {
                        done(null, user);
                    }
                })
                .catch(function(e) { 
                    done(null, false, req.flash('loginMessage',e.name + " " + e.message));
                });             
    }));

    =========================================================================
    // LOCAL SIGNUP ============================================================
    passport.use('local-signup', new LocalStrategy({
        // by default, local strategy uses username and password, we will override with email
        usernameField : 'email',
        passwordField : 'password',
        passReqToCallback : true // allows us to pass in the req from our route (lets us check if a user is logged in or not)
    },
    function(req, email, password, done) {        
        //  Whether we're signing up or connecting an account, we'll need
        //  to know if the email address is in use.

        User.findOne({ where: { email: email }})
            .then(function(existingUser) {

                // check to see if there's already a user with that email
                if (existingUser) 
                    return done(null, false, req.flash('error', 'That email is already taken.'));

                //  If we're logged in, we're connecting a new local account.
                if(req.user) {
                    var user            = req.user;
                    user.email    = email;
                    user.password = User.generateHash(password);
                    user.save().catch(function (err) {
                        throw err;
                    }).then (function() {
                        done(null, user);
                    });
                } 
                //  We're not logged in, so we're creating a brand new user.
                else {
                    // create the user
                    var newUser = User.build ({email: email, password: User.generateHash(password)}); 
                    newUser.save().then(function() {done (null, newUser);}).catch(function(err) { done(null, false, req.flash('error', err));});
                }
            })
            .catch(function (e) {
                done(null, false, req.flash('loginMessage',e.name + " " + e.message));              
            })

    }));

And in routes.js

// locally --------------------------------
    // LOGIN ===============================
    // show the login form
    app.get('/login', function(req, res) {
        res.render('login.ejs', { message: req.flash('loginMessage') });
    });

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

    // SIGNUP =================================
    // show the signup form
    app.get('/signup', function(req, res) {
        res.render('signup.ejs', { message: req.flash('loginMessage') });
    });

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

Thanks in advance.

like image 938
YanetP1988 Avatar asked Apr 27 '17 20:04

YanetP1988


People also ask

What does passport authenticate () do?

In this route, passport. authenticate() is middleware which will authenticate the request. By default, when authentication succeeds, the req. user property is set to the authenticated user, a login session is established, and the next function in the stack is called.

What is NPM passport?

Passport is Express-compatible authentication middleware for Node. js. Passport's sole purpose is to authenticate requests, which it does through an extensible set of plugins known as strategies.

How does Nodejs passport work?

Passport is a popular, modular authentication middleware for Node. js applications. With it, authentication can be easily integrated into any Node- and Express-based app. The Passport library provides more than 500 authentication mechanisms, including OAuth, JWT, and simple username and password based authentication.


1 Answers

I found the solution!!! It was simpler than I thought, just a carelessness. In user model I defined password field:

password: {
      type: DataTypes.STRING(25),
      allowNull: true,
      defaultValue: ''
    },

And after encryption, this field length was too small to storage the value. So I changed it for 255.

like image 160
YanetP1988 Avatar answered Sep 18 '22 06:09

YanetP1988