Using PassportJS, how does one pass additional form fields to the local authentication strategy?
There's a passReqToCallback
option that you can enable, like so:
passport.use(new LocalStrategy( {usernameField: 'email', passReqToCallback: true}, function(req, email, password, done) { // now you can check req.body.foo }));
When, set req
becomes the first argument to the verify callback, and you can inspect it as you wish.
In most common cases we need to provide 2 options for login
- with email
- with mobile
Its simple , we can take common filed username and query $or by two options , i posted following snippets,if some one have have same question .
We can also use 'passReqToCallback' is best option too , thanks @Jared Hanson
passport.use(new LocalStrategy({ usernameField: 'username', passReqToCallback: true}, async (req, username, password, done) => { try { //find user with email or mobile const user = await Users.findOne({ $or: [{ email: username }, { mobile: username }] }); //if not handle it if (!user) { return done(null, { status: false, message: "That e-mail address or mobile doesn't have an associated user account. Are you sure you've registered?" }); } //match password const isMatch = await user.isValidPassword(password); debugger if (!isMatch) { return done(null, { status: false, message: "Invalid username and password." }) } //otherwise return user done(null, { status: true, data: user }); } catch (error) { done(error, { status: false, message: error }); }}));