паспорт js десериализовать пользователя никогда не вызывают - PullRequest
0 голосов
/ 31 октября 2018

Я создаю экспресс-приложение с паспортом js для аутентификации, реализуя локальную стратегию

Я использую почтальон для проверки кода, я могу получить успешный ответ на запросы входа в систему и выхода из системы,

Но когда я пытаюсь получить доступ к любому из защищенных маршрутов после входа в систему с действительными учетными данными, я получаю сообщение о несанкционированной ошибке

Я обнаружил, что причиной неавторизованного сообщения является то, что passport.session () не запускает deserializeUser () при последующих запросах, что приводит к отказу в доступе

Это структура моего приложения. Пожалуйста, кто-нибудь укажет мне, где я не прав

У меня есть такой app.js, где я импортирую все и инициализирую

app.js

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var cors = require('cors');
var bodyParser = require('body-parser');
var passport = require('passport');
var session = require('express-session');

require('./config/passport')(passport);

var authRouter = require('./routes/authRouter')(passport);
var studentRouter = require('./routes/studentRouter');
var facultyRouter = require('./routes/facultyRouter');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended:true}));
app.use(session({
   secret: 'keyboard cat',
   resave: false,
   saveUninitialized: true,
}))
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(passport.initialize());
app.use(passport.session());
app.use(cors());

app.use('/', authRouter);
app.use('/student', studentRouter);
app.use('/faculty', facultyRouter);

На данный момент я использую только локальную стратегию для аутентификации, чтобы добавить дополнительные стратегии и заставить ее работать с другими стратегиями, я реализовал конфигурацию для паспорта js в отдельном модуле и использовал ее

/ конфигурации / passport.js

var LocalStrategy = require('passport-local').Strategy;
var db = require('../services/dbConnection');

module.exports = function(passport) {
  passport.serializeUser(function(id, done) {
    console.log("id", id);
    done(null, id["student_id"]);
  });

  passport.deserializeUser(function(id, done) {
    console.log("deserialize", id);
    db.query("SELECT * FROM students WHERE student_id = ?", [id], function(
      err,
      data,
      fields
    ) {
      done(err, data[0]);
    });
  });

  passport.use(new LocalStrategy({passReqToCallback:true},
    function(req,username,password,done){
      console.log(username,password,req.body.role);
      db.query("SELECT * FROM students WHERE student_id = ?",[username],function(err,data,fields){
        if(err){
          return done(err);
        }
        if(data.length === 0){
          return done(null,false);
        }
        if(data[0]['password'] !== password){
          return done(null,false);
        }
        data[0]['role']=req.body.role;
        return done(null,data[0]);
      })
    }
  ));

};

Маршруты, связанные с аутентификацией, помещены в отдельный файл маршрутов

/ маршруты / authRouter.js

var express = require("express");
var router = express.Router();
var response = require("../services/responseFormat");
var statusCodes = require("../constants/httpStatusCodes");

module.exports = function(passport) {

  router.post("/signup", function(req, res, next) {});

  router.post("/login", passport.authenticate("local"), function(
    req,
    res,
    next
  ) {
    message = {
      success: true
    };
    response.sendSuccessResponse(res, statusCodes.OK, message);
  });

  router.get("/logout", function(req, res, next) {
    req.logout();
    message = {
      success: true
    };
    response.sendSuccessResponse(res, statusCodes.OK, message);
  });
  return router;
};

У меня есть другие настройки маршрутов в соответствующих модулях и контроллерах для каждого из них, содержащих соответствующие функции

/ маршруты / studentRouter.js

var express = require('express');
var router = express.Router();
var studentController = require('../controllers/studentController');
var authenticationMiddleWare = require('../middlewares/checkAuthenticated');

// Routes that deal with marks
router.get('/:studentId/marks/:occurrenceId',authenticationMiddleWare.isAuthenticated,studentController.getMarks);
router.put('/marks/:markId',authenticationMiddleWare.isAuthenticated,studentController.updateRemarks);

Я написал промежуточное программное обеспечение для проверки подлинности пользователя, которое вызывает обработчик маршрута, если проверено подлинность, иначе отправляет неавторизованное сообщение об ошибке

...