can we use passport local strategy and passport google stategy to implement login functionality

932 Views Asked by At

I have implemented passport local strategy and passport google strategy to implement login functionality,my google strategy is working fine but when am login with local strategy its calling the serializable and deserializable method of passport's google strategy.

I have made separate instances for both (i.e both for local and google strategy) , still the serializableUser and deserializableUer method of only google strategy is getting called for both the strategies as the result req.user remains undefined in case of local strategy since the user is not setting in the session

i have visited a lot of stackoverflow questions but i didn't get any solution, finally i am wondering that is it even possible to use passport local strategy and passport google stategy to implement login functionality in the same project?

My Question is similar to this ( the serialize and deserialze methods are not getting called separately )

app.js

here googleS and localS are instances of two different strategies i.e, local and google sttrategies.

const express = require("express");
const path = require("path");
const exphbs = require("express-handlebars");
const bodyParser = require("body-parser");
const mongoose = require("mongoose");
const passport = require("passport");
const Cpassport=require('./config/Cpassport');

const cookieParser = require("cookie-parser");
const session = require("express-session");
const methodOverride = require("method-override");
const flash = require("express-flash");
const mailer = require("express-mailer");
//Handlebars helpers
const {
  truncate,
  stripTags,
  formatDate,
  select,
  editIcon
} = require("./helpers/hbs");


 var googleS = new passport.Passport();

 var localS = new passport.Passport();

const app = express();
//set static folder

app.use(express.static(path.join(__dirname, "public")));

//load keys
const keys = require("./config/keys");

//Map global Promises
mongoose.Promise = global.Promise;

//Mongoose Connection

mongoose
  .connect(keys.mongoURI)
  .then(() => console.log("MongoDB Connected"))
  .catch(err => console.log(err));

//load user model
require("./models/User");
//story model
require("./models/Story");

//feedback model
require("./models/Feedback");

//local strategy model
require("./models/CUser");

//session
app.use(cookieParser());

app.use(
  session({
    secret: "secret",
    resave: true,
    saveUninitialized: true
  })
);

//passport config
require("./config/passport")(googleS);
require("./config/Cpassport")(localS);

//Passport Middleware
app.use(passport.initialize());
app.use(passport.session());



//flash middleware
app.use(flash());

//set global variables
app.use((req, res, next) => {
  res.locals.success_msg = req.flash("success_msg");
  res.locals.error_msg = req.flash("error_msg");
  res.locals.error = req.flash("error");
  res.locals.user = req.user || null;
  // res.locals.userr = req.userr || null;


  console.log("this is requested user");
  console.log(res.locals.user);
  // console.log(res.locals.userr);

   next();
});

// Load Routes
const auth = require("./routes/auth");
const index = require("./routes/index");
const stories = require("./routes/stories");
const mailOptions = require("./helper/mailer");

//body-parser middleware
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

//method overriding body parser
app.use(methodOverride("_method"));

//mailer
mailer.extend(app, {
  from: "Belle Solutions",
  host: "smtp.gmail.com",
  secureConnection: true,
  port: 465,
  transportMethod: "SMTP",
  auth: {
    user: keys.email,
    pass: keys.pass
  }
});

//handlebars
app.engine(
  "handlebars",
  exphbs({
    helpers: {
      truncate: truncate,
      stripTags: stripTags,
      formatDate: formatDate,
      select: select,
      editIcon: editIcon
    },

    defaultLayout: "main"
  })
);



// app.get('*' , function(req ,res ,next){
//   res.locals.user=req.user || null;
//   console.log(req.user);
//   console.log('printing user');
//   console.log(res.locals.user);

//   next();
//   })




app.set("view engine", "handlebars");

//use routes
app.use("/auth", auth);
app.use("/", index);
app.use("/stories", stories);

const port = process.env.PORT || 5000;

app.listen(port, () => {
  console.log(`Server started on port ${port}`);
});

google Strategy file

const GoogleStrategy=require('passport-google-oauth20').Strategy;
const mongoose = require('mongoose');
const keys = require('./keys');
const passport = require('passport');

const User =mongoose.model('users');

module.exports=function(googleS){

googleS.use(
    new GoogleStrategy({
        clientID:keys.googleClientID,
        clientSecret:keys.googleClientSecret,
        callbackURL:'/auth/google/callback',
        proxy:true
    },(accessToken,refreshToken,profile,done)=>{

        // console.log("This is access token......................................................");
        // console.log(accessToken);
        // console.log("This is profile...............................");
        // console.log(profile);
        const image = profile.photos[0].value.substring(0, profile.photos[0].value.indexOf('?'));

        const newUser = {
            googleID:profile.id,
            firstName:profile.name.givenName,
            lastName:profile.name.familyName,
            email:profile.emails[0].value,
            image:image
        }

//check for existing model
User.findOne({
    googleID:profile.id
}).then( user=>{

if(user){
    done(null,user);
}else{

    new User(newUser)
    .save()
    .then(user => done(null,user));

}


} )

    })
)


passport.serializeUser( (user,done)=>{
    console.log("in serialize  of oauth.............")
    done(null,user.id);
} );

passport.deserializeUser( (id,done)=>{
    console.log("in deserialize of oauth.....................")
    User.findById(id).then(user =>done(null,user));

} );

}

local Strategy file

const LocalStrategy=require('passport-local').Strategy;
const mongoose = require('mongoose');
const bcrypt=require('bcryptjs');
const passport=require('passport');
//const User =require('../models/CUser')
//Load user Model
const Strategy =require('../app');

var local=Strategy.localS;




require('../models/CUser');
const CUser = mongoose.model('CUsers');


module.exports=function(localC){
console.log(localC)
    //local Strategy
console.log("inside passport...........");
console.log(local);

localC.use(
    new LocalStrategy({
        usernameField:'email'},(email,password,done)=>{
//match usernaame
console.log(email);
console.log(password)
let query ={email:email};

CUser.findOne(query , function(err,user){
    console.log("Before error")
    if(err) throw err;
if(!user){

    return done(null,false,{message:'No user Found'});

}

bcrypt.compare(password,user.password,function(err,isMatch){
    console.log("In compare function......")
if(err) throw err;
if(isMatch){

    console.log("here......")
    console.log(user)
    return done(null,user);

}else{
    return done(null,false,{message:'Wrong password'})
}

})

})



    }))


    passport.serializeUser(function(user, done) {
          console.log("in serialize of local strategy............")
        done(null, user.id);
      });


   passport.deserializeUser(function(id, done) {
          console.log("in deserialize og local strategy........")
        CUser.findById(id, function(err, user) {
          done(err, user);
        });
      });


}

The problem here is that when i am doing login by local strategy its still calling the serialize and deserialize methods of google strategy and as a result unable to set the user of local strategy into session so its returning undefined on req.user. why its happening , am i wrong anywhere? Please suggest ,I am in the need of an immediate help, i am stuck with this problem from the last three days. Any help is greatly appreciated and i will be very thankful for the person.

0

There are 0 best solutions below