简体   繁体   English

Passport NodeJs 身份验证问题

[英]Problem with Passport NodeJs authentication

I am using Passport Local for authentication.我正在使用Passport Local进行身份验证。 But whenever I try to login it is just using failureRedirect and not creating Cookie.但是每当我尝试登录时,它只是使用failureRedirect而不是创建 Cookie。 I have checked my code so many times but it still does the same.我已经检查了很多次我的代码,但它仍然是一样的。 What I have observed that my passport.js file is not executing for some resion.我观察到我的 passport.js 文件没有执行某些版本。

My App Index File我的应用程序索引文件

 //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}`); });

My index router file我的索引路由器文件

 //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用户路由器文件

 //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 and Passport local strategy file 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); }); });

I just find one bug in serializeUser , put user.id in callback not done try and don't use return in serializeUser and deserializeUser like this:我只是在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);
    });
  });

and remove this line in Passport file, because don't need to exports并删除 Passport 文件中的这一行,因为不需要导出

module.exports=passport;

and use bodyParser module to parse body of requests to json并使用 bodyParser 模块解析对 json 的请求正文

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM