Utilisez un courrier électronique avec Passport-local. L'aide précédente ne fonctionne pas

Donc, j'utilise le passeport local et je m'exprime pour gérer le journal des utilisateurs. Jusqu'à présent, j'ai pu obtenir un connexion réussie lors de l'utilisation de noms d'utilisateur, mais les noms d'utilisateurs sont difficiles à retenir et je ne pense personnellement pas qu'ils devraient être utilisés pour traiter les utilisateurs, alors j'ai essayé de modifier l'exemple Stratégie fournie sur le passeport- Page locale pour confirmer les utilisateurs par courrier électronique, mais le code ne fonctionne pas.

La stratégie que j'ai pour les emails est la suivante:

passport.use(new LocalStrategy(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 ' + e }); } user.comparePassword(password, function(err, isMatch) { if (err) return done(err); if(isMatch) { return done(null, user); } else { return done(null, false, { message: 'Invalid password' }); } }); }); })); 

Et c'est dérivé de cette stratégie:

 //The login strategy passport.use(new LocalStrategy(function(username, password, done) { User.findOne({ username: username }, function(err, user) { if (err) { return done(err); } if (!user) { return done(null, false, { message: 'Unknown user ' + username }); } user.comparePassword(password, function(err, isMatch) { if (err) return done(err); if(isMatch) { return done(null, user); } else { return done(null, false, { message: 'Invalid password' }); } }); }); })); 

Donc, la stratégie de nom d'utilisateur fonctionne parfaitement bien, mais l'adresse email n'est pas. J'ai même laissé une console.log () dans la stratégie de nom d'utilisateur et de courrier électronique pour voir ce que les stratégies revenaient. La stratégie de nom de domaine renvoie toutes les informations sur l'utilisateur, tandis que la stratégie de messagerie retourne

faux

. Je ne sais pas pourquoi le site fait cela, et aucune des solutions que j'ai vues jusqu'ici ne fonctionnent.

Une solution que j'ai vu sur une autre publication m'a suggéré d'utiliser la

  findOne({email: email}, function(err, user){ }); 

Option de connexion avec le courrier électronique pour trouver l'utilisateur, mais il n'a pas fonctionné du tout.

Voici le fichier Jade que j'utilise pour prendre l'entrée de l'utilisateur:

 extends layout block content h1 Login form(action= '/login', method='post') p Email br input#email(type='text',value='',placeholder='@',name='email') p Password br input#password(type='password',value='',placeholder='Password',name='password') input(type='submit') Submit 

Et voici l'entrée POST:

 // POST /login // This is an alternative implementation that uses a custom callback to // acheive the same functionality. exports.postlogin = function(req, res, next) { passport.authenticate('local', function(err, user, info) { if (err) { return next(err) } if (!user) { req.session.messages = [info.message]; return res.redirect('/login') } req.logIn(user, function(err) { if (err) { return next(err); } return res.redirect('/'); }); })(req, res, next); }; 

Mais qu'est ce qu'il se passe ici? Avec le courrier électronique, il devrait fonctionner parfaitement. Aussi, puisque je pose une question de toute façon, comment puis-je confirmer l'email après que quelqu'un s'était enregistré?

Il me semble que vous venez de changer le nom de l'argument dans le callback de LocalStrategy pour "email". Le passeport ne sait pas automatisé que le champ s'appelle courrier électronique, mais il faut le dire.

Par défaut, LocalStrategy s'attend à trouver des informations d'identification dans les paramètres nommés nom d'utilisateur et mot de passe. Si votre site préfère nommer ces champs différemment, des options sont disponibles pour modifier les valeurs par défaut.

 passport.use(new LocalStrategy({ usernameField: 'email', passwordField: 'passwd' }, function(username, password, done) { // ... } )); 

La source