node.js - 无法调用 Passport 本地策略

标签 node.js mongodb express angular5 passport-local

我是 Angular 5 的初学者,目前正在开发一个应用程序。所以在登录模块中,passport本地策略不起作用,passport.authenticate函数不起作用,我似乎在代码中找不到问题。

现在我不知道出了什么问题,因为控制台上没有错误,而且每次都返回 null。这就是为什么我复制粘贴大量代码。

代码附在下面。

Server.js 文件

const express = require('express');
const bodyParser = require('body-parser');
const path = require('path');
const http = require('http');
const cors = require('cors');
const app = express();
const cookieParser = require('cookie-parser');
const exphbs = require('express-handlebars');
const expressValidator = require('express-validator');
const flash = require('connect-flash');
const session = require('express-session');
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;

// API file for interacting with MongoDB
const api = require('./routes/api');
const auth = require('./routes/auth_companies');

require('./models/passport');

// Parsers/middlewares
app.use(cors());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
app.use(cookieParser());

app.use(flash());

// Angular DIST output folder
app.use(express.static(path.join(__dirname, 'dist')));
app.use(express.static('public'));

// API location
app.use('/api', api);
app.use('/auth', auth);
// Express Session
app.use(session({
secret: 'secret',
saveUninitialized: true,
resave: true
}));

// Passport init
app.use(passport.initialize());
app.use(passport.session());

// Express Validator
app.use(expressValidator({
errorFormatter: function(param, msg, value) {
  var namespace = param.split('.')
  , root    = namespace.shift()
  , formParam = root;

while(namespace.length) {
  formParam += '[' + namespace.shift() + ']';
 }
return {
  param : formParam,
  msg   : msg,
  value : value
};
}
}));

// Connect Flash
app.use(flash());

// Global Vars
app.use(function (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;
next();
});

// Send all other requests to the Angular app
//app.get('*', (req, res) => {
// res.sendFile(path.join(__dirname, 'dist/index.html'));
//});

// start the server
//app.listen(app.get('port'), () => {
// console.log('server on port 3000');
//}); 


//Set Port
const port = process.env.PORT || '3000';
app.set('port', port);

const server = http.createServer(app);
console.log(port);
server.listen(port, () => console.log(Running on localhost:${port}));

Passport.js 文件

        const express = require('express');
    const router = express.Router();
    const passport = require('passport');
    const LocalStrategy = require('passport-local').Strategy;

    const User = require ('./reg_company');

    passport.serializeUser(function(user, done) {
      done(null, user.id);
    });

    passport.deserializeUser(function(id, done) {
      User.getUserById(id, function(err, user) {
        done(err, user);
      });
    });

    passport.use( new LocalStrategy(
      function(email, password, done) {
        console.log('9900---------------------------------', email)
       User.getUserByEmail(email, function(err, user){
        if(err) throw err;
        if(!user){
          return done(null, false, {message: 'Unknown User'});
        }

        User.comparePassword(password, user.password, function(err, isMatch){
          if(err) throw err;
          if(isMatch){
            return done(null, user);
          } else {
            return done(null, false, {message: 'Invalid password'});
          }
        });
       });
      }));

    passport.use('local.signup' , new LocalStrategy ({
      passReqToCallback : true ,
      emailfield:'email',
      passwordfield:'password'
    }, function(req, email, password, done){
      User.findOne({'email':email}, function(err, user){
        if (err)
        {
          return done(err);
        }

        if (user)
        {
          return done (null, false);
        }

        const newCompany=new User();
        newCompany.email = req.body.email;
        newCompany.password = req.body.passport;

        User.createUser(newCompany, function(err, user){
          if(err) throw err;
          console.log(user);
          return done(null, user);
        });

      })
    }) )

蒙戈文件

        const mongoose = require('mongoose');
    const uri='mongodb://localhost/tourhubdb';
    mongoose.connect(uri);
    const db=mongoose.connection;
    const bcrypt = require('bcryptjs');

    //tourist Schema
    let company_reg_schema = mongoose.Schema({
        email:{
            type:String,
            require:true
        },
        password:
        {
            type:String,
            require:true
        }
    });

    let User = module.exports = mongoose.model('companies',company_reg_schema);

    module.exports.createUser = function(newUser, callback){
      bcrypt.genSalt(10, function(err, salt) {
          bcrypt.hash(newUser.password, salt, function(err, hash) {
              newUser.password = hash;
              newUser.save(callback);
          });
      });
    }

    module.exports.getUserByEmail = function(email, callback){
      var query = {email: email};
      User.findOne(query, callback);
    }

    module.exports.getUserById = function(id, callback){
      User.findById(id, callback);
    }

    module.exports.comparePassword = function(candidatePassword, hash, callback){
      bcrypt.compare(candidatePassword, hash, function(err, isMatch) {
          if(err) throw err;
          callback(null, isMatch);
      });
    }

路线文件

        const express = require("express");
    const router = express.Router();

      router.post('/login',function (req,res,next){
      passport.authenticate('local-login', function (err ,user ,info){
      })(req ,res ,next);
      });



      module.exports = router;

最佳答案

这里只是我的两分钱......无论你在哪里返回完成(空......) Passport.use(),您可以针对不同的 done() 调用将 null 值替换为不同的错误,并查看调用哪一个以及原因。

关于node.js - 无法调用 Passport 本地策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49202736/

相关文章:

linux - Angular/快速托管

node.js - set/add方法不是sequelize Node js的函数

javascript - 如何加载配置json作为环境变量nodejs

node.js - MongoDB。通过一次查询获取每种产品不同时间段的价格

mongodb - Spring data mongodb-聚合框架集成

javascript - 如何返回静态数据?

mongodb - 无法创建用户

python - 在 for 循环中嵌套 for 循环,将每个循环打印到新文件

javascript - 在迭代到下一个循环之前如何等待每个内部完成?

node.js - Node JS - 无法在 ubuntu 16.04 中安装 Node js 版本 8.9 或更高版本