Можем ли мы использовать локальную стратегию для паспорта и политику паспорта Google для реализации функции входа - PullRequest
0 голосов
/ 06 октября 2018

Я реализовал паспортную локальную стратегию и стратегию паспортного Google для реализации функции входа в систему, моя стратегия Google работает нормально, но когда я использую локальную стратегию, она вызывает сериализуемый и десериализуемый метод стратегии Google для паспорта.

Iсоздали отдельные экземпляры для обоих (то есть как для локальной стратегии, так и для стратегии Google), тем не менее, метод serializableUser и deserializableUer только для стратегии Google вызывается для обеих стратегий, так как результат req.user остается неопределенным в случае локальной стратегии, поскольку пользовательне устанавливая в сеансе

я посетил много вопросов о стековом потоке, но у меня не было никакого решения, наконец, мне интересно, возможно ли даже использовать локальную стратегию passport и passport google stategy для реализации функциональности входа в системув том же проекте?

Мой вопрос похож на этот ( методы сериализации и десериализации не вызываются отдельно )

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.почему это происходит, я ошибаюсь где-нибудь?Пожалуйста, предложите, мне нужна немедленная помощь, я застрял с этой проблемой в течение последних трех дней.Любая помощь очень ценится, и я буду очень благодарен за человека.

...