我已经实施了护照本地策略和护照谷歌策略来实现登录功能,我的谷歌策略运行良好,但是当我使用本地策略登录时,它调用护照谷歌策略的可序列化和可反序列化方法。
我已经为这两个策略创建了单独的实例(即本地和谷歌策略),仍然只调用谷歌策略的 serializableUser 和 deserializableUer 方法,因为结果 req.user 在本地策略的情况下仍然未定义,因为用户未在会话中设置
我已经访问了很多stackoverflow问题,但我没有得到任何解决方案,最后我想知道是否可以使用护照本地策略和护照谷歌策略在同一个项目中实现登录功能?
我的问题与此类似(未分别调用序列化和反序列化方法)
应用程序.js
这里 googleS 和 localS 是两种不同策略的实例,即 local 和 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}`);
});
谷歌策略文件
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);
});
});
}
这里的问题是,当我通过本地策略登录时,它仍然调用谷歌策略的序列化和反序列化方法,因此无法将本地策略的用户设置为会话,因此它在 req.user 上返回未定义。为什么会发生,我在哪里错了吗?请建议,我需要立即帮助,从过去三天开始我就一直遇到这个问题。非常感谢任何帮助,我将非常感谢这个人。