Używam pliku paszport.js i chcę wysłać wiadomość, jeśli pola formularza są puste. Ale nie wiem, jak to zrobić, ponieważ paszport nie uruchamia strategii oddzwaniania, jeśli ich nie ma. Naprawdę chcę, aby ten przypadek użycia był bardziej przejrzysty i nie chcę modyfikować paszportu. Czuję, że jest sposób, żeby to zrobić, ale nie wiem gdzie! Próbowałem użyć wywołania zwrotnego trasy (app.post
), ale nie działa tak, jak próbowałem.Uwierzytelnianie Node.js za pomocą usługi Passport: Jak wysłać wiadomość, jeśli brakuje pola?
Oto prototyp funkcja uwierzytelnienia:
Strategy.prototype.authenticate = function(req, options) {
options = options || {};
var username = lookup(req.body, this._usernameField) || lookup(req.query, this._usernameField);
var password = lookup(req.body, this._passwordField) || lookup(req.query, this._passwordField);
// here is my problem
if (!username || !password) {
return this.fail({ message: options.badRequestMessage || 'Missing credentials' }, 400);
}
var self = this;
function verified(err, user, info) {
if (err) { return self.error(err); }
if (!user) { return self.fail(info); }
self.success(user, info);
}
try {
if (self._passReqToCallback) {
this._verify(req, username, password, verified);
} else {
this._verify(username, password, verified);
}
} catch (ex) {
return self.error(ex);
}
};
Oto moja strategia:
passport.use('local-login', new LocalStrategy({
usernameField : 'email',
passwordField : 'password',
passReqToCallback : true
},
function(req, email, password, done) {
// ...
console.log("Hello");
User.findOne({ 'local.email' : email }, function(err, user) {
if (err)
return done(err);
// if no user is found, return the message
if (!user)
return done(null, false, req.flash('loginMessage', 'Pas d\'utilisateur avec ce login.')); // req.flash is the way to set flashdata using connect-flash
// if the user is found but the password is wrong
if (!user.validPassword(password))
return done(null, false, req.flash('loginMessage', 'Oops! Mauvais password.')); // create the loginMessage and save it to session as flashdata
// all is well, return successful user
return done(null, user);
});
}));
I wreszcie moja droga:
app.get('/login', function(req, res) {
// render the page and pass in any flash data if it exists
res.render('login', { title: "Connexion", 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
}, function(err, user, info) {
// Was trying this callback, does'nt work, post callback maybe ?
console.log("Hello");
}));
gdzie jest twój jade lub szablon? powinieneś sprawdzić 'wiadomość' i wyświetlić, jeśli jest obecny – anvarik
Precyzja: Rzecz w tym, że jest wiadomość flash, gdy użytkownik lub hasło jest błędne, ale nie wtedy, gdy pola są puste. I nie mogę tego zrobić ponieważ wywołanie zwrotne w strategii nie jest wywoływane w tym scenariuszu przez paszport (zobacz protokół uwierzytelniania). Nie chcę włamać się do kodu paszportowego, musi być jakiś sposób. –
return this.fail ({message: options.badRequestMessage || 'Missing credentials'}, 400); <- to jest zwracane zamiast tego i nie wiem jak mogę to uzyskać, na przykład w funkcji wywołania zwrotnego app.post. –