【问题标题】:Problem with Passport NodeJs authenticationPassport NodeJs 身份验证问题
【发布时间】:2021-02-02 19:59:29
【问题描述】:

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

【问题讨论】:

  • 如果您的问题解决了,请接受我的回答,谢谢

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


【解决方案1】:

我只在serializeUser 中发现一个错误,将user.id 放入回调而不是done 尝试不要在serializeUserdeserializeUser 中使用return,如下所示:

passport.serializeUser(function(user, done) {
    done(null, user.id);
  });
  
  passport.deserializeUser(function(id, done) {
    User.findById(id, function(err, user) {
      done(err, user);
    });
  });

并删除 Passport 文件中的这一行,因为不需要导出

module.exports=passport;

并使用 bodyParser 模块将请求正文解析为 json

const bodyParser = require('body-parser');
app.use(bodyParser.json())

【讨论】:

  • 还是不行。我可以看到我的“passport js”文件工作正常,但中间件“LocalPassport”没有访问我不知道为什么。我已经测试过了。你知道吗?
  • w0o0o0o0o0w,不要在possport.js中使用module.exports=passport,我已经更新了我的答案,请检查一下
  • 还是没有结果,是passport.js文件访问但不是中间件的情况。。。顺便谢谢合作
  • 还是没有成功
  • 检查请求头,设置 content-type: application/json ... 并显示请求集
猜你喜欢
  • 1970-01-01
  • 2018-01-05
  • 2018-01-31
  • 1970-01-01
  • 2021-09-30
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
  • 2014-11-19
相关资源
最近更新 更多