javascriptnode.jsexpresspassport.jspassport-local

Passport Local.js with email instead of username


I am using passport-local to authenticate users. However, I am using email and password to login instead of the default username.

How do I change my configuration to change username to email in passport.authenticate?

Here is my LocalStrategy code:

const strategy = new LocalStrategy(userSchema.authenticate() )
passport.use(strategy);

Here is my signup code:

app.post('/signup', async function (req, res) {

  const email = req.body.email;
  const password = req.body.password;
  const passwordretype = req.body.passwordretype
  const name = req.body.name
  if (password.length < 5) {

    return res.render('signup', { error: "Your Password must be at least 5 characters in length" })

  }
  if (password !== passwordretype) {
    return res.render('signup', { error: "Your Passwords must match" })

  }
  if (password.length > 40) {
    return res.render('signup', { error: "Your Password must be under 40 characters in length" })

  }

  if (name.length > 50) {
    return res.render('signup', { error: "Your Name must be under 50 characters in length" })

  }
  const doc = await userSchema.findOne({ email: email })
  if (doc) {
    return res.render('signup', { error: "This email is already in use with the sign up method: " + doc.method })
  }


  const randomnum = String(Math.floor(Math.random() * 10000))
  const username1 = name.split(' ').join('')
  const username = username1.concat(randomnum)

    userSchema.register(
      new userSchema({ 
        email: email,
        method: 'email',
        credits: 0,
        totalearned: 0,
        totalspent: 0,
        purchases: [],
        currentlysolving: null,
        solved: [],
        posted: [],
        currentposted: [],
        level: 0,
        username: username,
        feescollected:0,
        }), req.body.password, function (err, user) {
          
        if (err) {
          return res.render('signup', { error: err })
        } else {
          req.login(user, (er) =>  {
            if (er) {
              return res.render('signup', { error: err })
            }
            else {
              res.redirect('/')
            }
        });
    }
      }
    )

  


});

And finally, here is the login code that is not allowing email

app.post('/login', function (req, res) {
  //
 
  const state = req.query.state
  const email = req.body.email;
  const password = req.body.password;
//      
passport.authenticate("local", function (err, user, info) {
  if (err) {
    return res.render('login', { error: err, state: state })  }
  else {
      if (!user) {
        return res.render('login', { error: `The email or password entered is incorrect`, state: state })  
      }
      else {
          const token = jwt.sign({ userId: user._id, email: user.email }, secretkey, { expiresIn: "24h" });
          res.json({ success: true, message: "Authentication successful", token: token });
      }
  }
})(req, res);



})

How do I fix this? Thank you


Solution

  • I changed the strategy configuration

    passport.use(new LocalStrategy({
      usernameField: 'email'
    }, userSchema.authenticate()));
    

    I also changed the plugin in the schema to

    userSchema.plugin(passportLocalMongoose,
      {
          usernameField: 'email'
      });