Search code examples
node.jscallbackpassport.jspassport-local

how to send json data under passport local strategy


This is my passport Login Handler.

Now I want to send JSON Data under every condition so that API can access the response and on behalf of this display anything on frontend.

//Login Handler
passport.use('local-user', new LocalStrategy(
  function(username, password, done) {
    User.getUserByUsername(username, function(err, user){
        if(err) {
            console.log('error')
            logger.log('error', 'Error Generates on User.getUserByUsername Query on users.js file');
            throw err;
        }
        if(!user){
            //res.send('unknown user');
            console.log('Unknown User');
            return done(null, false, {message: 'Unknown User'});
        }
        User.comparePassword(password, user.password, function(err, isMatch){
            if(err) {
                logger.log('error', 'Error Generates on User.comparePassword Query on users.js file');
                throw err;
            }
            if(isMatch){
                return done(null, user);
            }else{
                return done(null, false, {message: 'Invalid Credential, please check carefully...!'})
            }
        });
    });
  }
));

Anyone have any idea for this? Thanks in advance


Solution

  • The local strategy will pass the user or error with done(), then you receive that with a callback and pack it with res.json()

    Here is my implementation. May help?

    passport.use(
          new LocalStrategy(
            {
              usernameField: "email"
            },
            function(username, password, done) {
              User.findOne({ email: username }, function(err, user) {
                if (err) {
                  return done(err);
                }
                if (!user) {
                  return done(null, false, {
                    email: "Email not found"
                  });
                }
                if (!user.validPassword(password)) {
                  return done(null, false, {
                    password: "Password is wrong"
                  });
                }
                return done(null, user);
              });
            }
          )
        );
    
        router.post("/login", function(req, res) {
          passport.authenticate("local", function(err, user, info) {
            if (err) {
              res.status(404).json(err);
              return;
            }
    
            if (user) {
              const token = user.generateJwt();
              res.status(200);
              res.json({
                userInfo: user,
                token: token
              });
            } else {
              res.status(401).json(info);
            }
          })(req, res);
        });