Passport NodeJs 身份验证问题

时间:2021-01-28 18:20:44

标签: javascript node.js mongodb passport.js passport-local

我使用 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);
    });
});

1 个答案:

答案 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;