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