Ich verwende passportJS und möchte meiner Authentifizierungsstrategie (passport-local) mehr als nur req.body.username
Und req.body.password
Hinzufügen.
Ich habe 3 Formularfelder: username
, password
, & foo
Wie greife ich in meiner lokalen Strategie auf req.body.foo
Zu?
passport.use(new LocalStrategy(
{usernameField: 'email'},
function(email, password, done) {
User.findOne({ email: email }, function(err, user) {
if (err) { return done(err); }
if (!user) {
return done(null, false, { message: 'Unknown user' });
}
if (password != 1212) {
return done(null, false, { message: 'Invalid password' });
}
console.log('I just wanna see foo! ' + req.body.foo); // this fails!
return done(null, user, aToken);
});
}
));
Ich rufe dies auf meiner Route (nicht als Route Middleware) folgendermaßen auf:
app.post('/api/auth', function(req, res, next) {
passport.authenticate('local', {session:false}, function(err, user, token_record) {
if (err) { return next(err) }
res.json({access_token:token_record.access_token});
})(req, res, next);
});
Es gibt eine passReqToCallback
-Option, die Sie wie folgt aktivieren können:
passport.use(new LocalStrategy(
{usernameField: 'email', passReqToCallback: true},
function(req, email, password, done) {
// now you can check req.body.foo
}
));
Wenn req
gesetzt ist, wird dies das erste Argument für den Verify-Callback, und Sie können es nach Belieben überprüfen.
In den meisten Fällen müssen zwei Optionen für die Anmeldung angegeben werden
Es ist ganz einfach, wir können den gemeinsamen Benutzernamen und die Abfrage $ verwenden oder über zwei Optionen folgende Snippets posten, wenn jemand die gleiche Frage hat.
Wir können auch 'passReqToCallback' verwenden, dies ist auch die beste Option, danke @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
});
}
}));