Я создаю экспресс-приложение с паспортом 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);
Я написал промежуточное программное обеспечение для проверки подлинности пользователя, которое вызывает обработчик маршрута, если проверено подлинность, иначе отправляет неавторизованное сообщение об ошибке