我们可以使用护照本地策略和护照谷歌策略来实现登录功能吗

时间:2018-10-06 17:21:42

标签: node.js mongodb express passport-local passport-google-oauth2

我已经实施了护照本地策略和护照Google策略来实现登录功能,我的Google策略运行良好,但是当使用本地策略登录时,它调用了护照Google策略的可序列化和可反序列化的方法。

我为这两个策略都创建了单独的实例(即针对本地策略和google策略),但仍然针对两种策略调用了仅谷歌策略的serializableUser和deserializableUer方法,因为对于本地策略,结果req.user仍未定义因为用户未在会话中进行设置

我访问了很多stackoverflow问题,但是我没有得到任何解决方案,最后我想知道,是否有可能甚至在同一项目中使用护照本地策略和护照谷歌策略来实现登录功能?

我的问题与此(the serialize and deserialze methods are not getting called separately

类似
  

app.js

     

此处googleS和localS是两种不同策略的实例,即本地策略和google策略。

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战略文件

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

} );

}
  

本地策略文件

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


}
  

这里的问题是,当我通过本地策略登录时,它仍在调用Google策略的序列化和反序列化方法,因此无法将本地策略的用户设置为会话,因此在req.user上返回undefined。   为什么会发生,我在哪里错了?请提出建议,我需要立即的帮助,从最近三天开始我就一直遇到这个问题。   任何帮助将不胜感激,我将非常感激此人。

0 个答案:

没有答案