我使用 Passport Local 进行身份验证。但是每当我尝试登录时,它只是使用 failureRedirect 而不是创建 Cookie。我已经多次检查我的代码,但它仍然是一样的。我观察到我的passport.js 文件没有在某些区域执行。
我的应用索引文件
//Main app index file
const express=require('express');
const cookieParser=require('cookie-parser');
const app=express();
const port=8000;
const layout=require('express-ejs-layouts');
const db=require('./config/mongoose');
const session=require('express-session');
const passport=require('passport');
const localStrategy=require('./config/passport-local-strategy');
app.use(express.urlencoded({ extended: true }));
app.use(cookieParser());
app.use(express.static('./assets'));
app.use(layout);
app.set('layout extractStyles',true);
app.set('layout extractScripts',true);
app.set('view engine','ejs');
app.set('views','./views');
app.use(session({
name:'Codeial',
secret:'Something',
saveUninitialized:false,
resave:false,
cookie:{
maxAge:(1000*60*100)
}
}));
app.use(passport.initialize());
app.use(passport.session());
app.use('/',require('./routes'));
app.listen(port,function(err){
if(err)
{
console.log(`Error:${err}`);
return;
}
console.log(`Sever runs on port:${port}`);
});
我的索引路由器文件
//index router file
const express=require('express');
const router=express.Router();
const control=require('../controller/router_controller');
const control2=require('../controller/user');
router.get('/',control.route);
router.use('/user',require('./users.js'));
console.log('Router is working');
module.exports=router;
用户路由器文件
//user router file
const express=require('express');
const router=express.Router();
const passport=require('passport');
const pro=require('../controller/profile')
const user=require('../controller/user');
router.get('/profile',pro.profile);
router.get('/sign-in',user.sign_in);
router.get('/sign-up',user.sign_up);
router.post('/create',user.create);
router.post('/create-session',passport.authenticate('local',{failureRedirect:'/user/sign-in'}),user.createSession);
module.exports=router;
Passport 和 Passport 本地策略文件
//passport and passport local strategy
const passport=require('passport');
const LocalPassport=require('passport-local').Strategy;
const User=require('../model/user');
passport.use(new LocalPassport({usernameField:'email'},function(email,password,done){
User.findOne({email:email},function(err,user){
if(err)
{
console.log('Error while finding data for authentication');
return done(err);
}
if(!user||user.password!=password)
{
return done(null,false);
}
return done(null,user);
});
}));
passport.serializeUser(function(user,done){
done(null,user.id);
});
passport.deserializeUser(function(id,done){
User.findById(id,function(err,user){
if(err)
{
console.log('Error while finding data for authentication');
return done(err);
}
done(null,user);
});
});
答案 0 :(得分:0)
我只是在 serializeUser
中发现一个错误,将 user.id
放在回调中而不是 done
尽量不要在 return
和 {{1} 中使用 serializeUser
}} 像这样:
deserializeUser
并删除 Passport 文件中的这一行,因为不需要导出
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
并使用 bodyParser 模块将请求体解析为 json
module.exports=passport;