106 votes

En utilisant PassportJS, comment passer des champs de formulaire supplémentaires à la stratégie d'authentification locale?

Je suis en train d'utiliser passportJS et je veux fournir plus que seulement req.body.username et req.body.password à ma stratégie d'authentification (passport-local).

J'ai 3 champs de formulaire : username, password, & foo

Comment accéder à req.body.foo depuis ma stratégie locale qui ressemble à ceci :

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: 'Utilisateur inconnu' });
        }
        if (password != 1212) {
          return done(null, false, { message: 'Mot de passe invalide' });
        }
        console.log('Je veux juste voir foo! ' + req.body.foo); // cela échoue !
        return done(null, user, aToken);

      });
    }
));

J'appelle ceci à l'intérieur de ma route (pas en tant que middleware de route) comme ceci :

  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);

  });

191voto

Jared Hanson Points 8390

Il y a une option passReqToCallback que vous pouvez activer, comme ceci :

passport.use(new LocalStrategy(
  {usernameField: 'email', passReqToCallback: true},
  function(req, email, password, done) {
    // maintenant vous pouvez vérifier req.body.foo
  }
));

Ensuite, en définissant req comme premier argument de la fonction de vérification, vous pouvez l'inspecter comme vous le souhaitez.

1voto

Bhagvat Lande Points 140

Dans la plupart des cas courants, nous devons fournir 2 options pour la connexion

  • avec email
  • avec mobile

C'est simple, nous pouvons prendre le champ d'username commun et interroger $or par deux options, j'ai posté les extraits suivants, si quelqu'un a la même question.

Nous pouvons également utiliser 'passReqToCallback' qui est la meilleure option aussi, merci @Jared Hanson

passport.use(new LocalStrategy({
    usernameField: 'username', passReqToCallback: true
}, async (req, username, password, done) => {
    try {
        //trouver l'utilisateur avec email ou mobile
        const user = await Users.findOne({ $or: [{ email: username }, { mobile: username }] });

        //si non trouvé, gérer
        if (!user) {
            return done(null, {
                status: false,
                message: "Cette adresse e-mail ou ce numéro de mobile n'a pas de compte d'utilisateur associé. Êtes-vous sûr de vous être inscrit ?"
            });
        }

        //correspondance de mot de passe
        const isMatch = await user.isValidPassword(password);
        debugger
        if (!isMatch) {
            return done(null, {
                status: false,
                message: "Nom d'utilisateur et mot de passe non valides."
            })
        }

        //sinon retourner l'utilisateur
        done(null, {
            status: true,
            data: user
        });
    } catch (error) {
        done(error, {
            status: false,
            message: error
        });
    }
}));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X