如何在多个用户上进行Passport身份验证?

时间:2017-03-24 10:35:36

标签: node.js mongodb authentication mongoose-schema passport-local

这里我有多个用户,如Parent,Trainer,Provider。我编写了单独的模式,路由和验证代码,用于注册和登录以及存储,每个集合也各不相同。当我运行应用程序时它正常运行。然后我打开了我注册为“父”的邮递员工具,响应是“注册成功”并作为父级登录我获得了令牌,以便我可以执行父项在我的项目中可以执行的功能。之后我退出作为parent.Next,当我尝试注册为Trainer / Provider时,响应为“Unauthorized”。但是我在注册时给出的字段存储在数据库中的相应集合中。当我给出父母在注册时向培训师注册和提供者注册时给出的相同值时,当我给出时,响应是“注册成功”父母给出的不同价值观显示我“未经授权”。所以,我想知道为什么会出现这个问题?我该如何解决这个问题?

这是我的架构代码

<!-- trainer schema -->
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var passportLocalMongoose = require('passport-local-mongoose');
var trainerUser= new Schema({
username:{type:String,required:true,unique:true},
email:{type:String,required:true,unique:true},
phone:{type:Number,required:true,unique:true    },
password:{type:String});
trainerUser.plugin(passportLocalMongoose);
module.exports = mongoose.model('trainerUser', trainerUser);    

<!-- parent schema -->
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var passportLocalMongoose = require('passport-local-mongoose');
var User = new Schema({
    username: String,
    email:String,
    password: String,
    phonenumber:Number
   });
User.plugin(passportLocalMongoose);
module.exports = mongoose.model('parentlog', User);

<!-- provider schema -->
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var passportLocalMongoose = require('passport-local-mongoose');
var User= new Schema({
username:{type:String,required:true,unique:true},
email:{type:String,required:true,unique:true},
phone:{type:Number,required:true,unique:true    },
password:{type:String});
User.plugin(passportLocalMongoose);
module.exports = mongoose.model('User',User);   

这是我的每个模块的路由代码 //培训师路线

<!-- trainer route -->
var express = require('express');
var router = express.Router();
var passport = require('passport');
var trainerUser = require('../models/traineruser');
var Verify    = require('./trainerverify');

<!-- GET users listing. -->
router.get('/', function(req, res, next) {
  res.send('respond with a resource');
});

router.post('/register', function(req, res) {
    trainerUser.register(new trainerUser({ username : req.body.username,email: req.body.email, phone:req.body.phone }),req.body.password,
      function(err, user) {
        if (err) {
            return res.status(500).json({err: err});
        }
        passport.authenticate('local')(req, res, function () {
            return res.status(200).json({status: 'Registration Successful!'});
        });
    });
});

router.post('/login', function(req, res, next) {
  passport.authenticate('local', function(err, user, info) {
    if (err) {
      return next(err);
    }
    if (!user) {
          return res.status(401).json({
        err: info
      });
    }
    req.logIn(user, function(err) {
      if (err) {
        return res.status(500).json({
          err: 'Could not log in user'
        });
      }

      var token = Verify.getToken(user);
              res.status(200).json({
        status: 'Login successful!',
        success: true,
        token: token
      });
    });
  })(req,res,next);
});

router.get('/logout', function(req, res) {
    req.logout();
  res.status(200).json({
    status: 'Bye!'
  });
});

module.exports = router;

//父路线

const AuthenticationController = require('../controllers/authentication');
var express = require('express');
var router = express.Router();
var passport = require('passport');
var User = require('../models/puser');
var Verify    = require('./parentverify');

var mongoose=require('mongoose');

const requireLogin = passport.authenticate('local', { session: false });
router.route('/')
.get(function(req, res) {
    User.find({},function(err,users){
        if(err) {
            return res.status(403).json({
                err: 'You are not authorized to perform this operation!'
            });
        } else {
            res.json(users);
        }
    });
});
router.post('/register', function(req, res) {
    User.register(new User({ username : req.body.username,email:req.body.email,phonenumber:req.body.phonenumber }),
      req.body.password, function(err, user) {
        if (err) {
            return res.status(500).json({err: err});
        }
        passport.authenticate('local')(req, res, function () {
            return res.status(200).json({status: 'Registration Successful!'});
        });
   });
});

router.post('/login', requireLogin, AuthenticationController.login);
router.get('/logout', function(req, res) {
    req.logout();
  res.status(200).json({
    status: 'Bye!'
  });
});
module.exports = router;

//提供商路线

var express = require('express');
var router = express.Router();
var passport = require('passport');
var User = require('../models/user');
var Verify= require('./userverify');

<!-- GET users listing. -->
router.get('/', function(req, res, next) {
  res.send('respond with a resource');
});

router.post('/register', function(req, res) {
    User.register(new User({ username : req.body.username,email: req.body.email, phone:req.body.phone }),req.body.password,
      function(err, user) {
        if (err) {
            return res.status(500).json({err: err});
        }
        passport.authenticate('local')(req, res, function () {
            return res.status(200).json({status: 'Registration Successful!'});
        });
    });
});

router.post('/login', function(req, res, next) {
  passport.authenticate('local', function(err, user, info) {
    if (err) {
      return next(err);
    }
    if (!user) {
          return res.status(401).json({
        err: info
      });
    }
    req.logIn(user, function(err) {
      if (err) {
        return res.status(500).json({
          err: 'Could not log in user'
        });
      }

      var token = Verify.getToken(user);
              res.status(200).json({
        status: 'Login successful!',
        success: true,
        token: token
      });
    });
  })(req,res,next);
});

router.get('/logout', function(req, res) {
    req.logout();
  res.status(200).json({
    status: 'Bye!'
  });
});
module.exports = router;

app.js代码在这里

  var express = require('express');
    var path = require('path');
    var favicon = require('serve-favicon');
    var logger = require('morgan');
    var cookieParser = require('cookie-parser');
    var bodyParser = require('body-parser');
    var mongoose = require('mongoose');
    var passport = require('passport');
    var LocalStrategy = require('passport-local').Strategy;
    var config = require('./config');
    mongoose.connect(config.mongoUrl);
    var db = mongoose.connection;
    db.on('error', console.error.bind(console, 'connection error:'));
    db.once('open', function () {
        <!-- we're connected! -->
        console.log("Connected correctly to server");
    });
    var users = require('./routes/users');
    var trainerusers = require('./routes/trainerusers');
    var pusers = require('./routes/pusers');
    var contacts=require('./routes/contactRouter');
    var student=require('./routes/studentRouter');
    var batch=require('./routes/batchRouter');
    var venue=require('./routes/venueRouter');
    var trainerrouter = require('./routes/trainerrouter.js');
    var report=require('./routes/reportRouter');
    var attendance=require('./routes/attendanceRouter');
    var app = express();
    <!-- view engine setup -->
    app.set('views', path.join(__dirname, 'views'));
    app.set('view engine', 'jade');
    <!-- uncomment after placing your favicon in /public-->
    <!-- app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));-->

    app.use(logger('dev'));
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({ extended: false }));
    app.use(cookieParser());

    <!-- passport config -->
    var User = require('./models/user');
    var trainerUser = require('./models/traineruser');
    var Puser = require('./models/puser');
    app.use(passport.initialize());
    passport.use(new LocalStrategy(Puser.authenticate(),trainerUser.authenticate(),User.authenticate()));
passport.serializeUser(Puser.serializeUser(),trainerUser.serializeUser(),User.serializeUser());
passport.deserializeUser(Puser.deserializeUser(),trainerUser.deserializeUser(),User.deserializeUser());
    app.use(express.static(path.join(__dirname, 'public')));
    app.use('/users', users);
    app.use('/trainerusers', trainerusers);
    app.use('/pusers', pusers);
    app.use('/contacts',contacts);
    app.use('/student',student);
    app.use('/batch',batch);
    app.use('/venue',venue);
    app.use('/report',report);
    app.use('/trainer',trainerrouter);
    app.use('/attendance',attendance);

    <!--  catch 404 and forward to error handler -->
    app.use(function(req, res, next) {
      var err = new Error('Not Found');
      err.status = 404;
      next(err);
    });
   <!-- error handlers -->
    <!-- development error handler -->
    <!-- will print stacktrace -->
    if (app.get('env') === 'development') {
      app.use(function(err, req, res, next) {
        res.status(err.status || 500);
        res.json({
          message: err.message,
          error: err
        });
      });
    }
    <!-- production error handler -->
    <!-- no stacktraces leaked to user -->
    app.use(function(err, req, res, next) {
      res.status(err.status || 500);
      res.json({
        message: err.message,
        error: {}
      });
    });
  module.exports = app;

0 个答案:

没有答案