Проблема здесь в том, что когда я вхожу с правильными деталями, должен быть создан сеанс и должен быть сгенерирован повар ie на стороне клиента, что происходит, когда я использую почтальон, но не в случае веб-браузеров.
Я использую следующее:
- паспорт для аутентификации данных входа в систему из mongoDB с использованием mon goose
- express -сессии для создания сеанса при входе пользователя в систему.
- cors на бэкэнде (реакция работает на порте 3000, а узел на порте 4000)
Вот мое приложение. js (бэкэнд):
var createError = require('http-errors');
var cookieParser = require('cookie-parser')
var path = require('path');
var logger = require('morgan');
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var serverRouter = require("./routes/server");
var DbRouter = require("./routes/DbRequest");
var ProductRouter = require("./routes/ProductRouter");
var CategoryRouter = require("./routes/CategoryRouter");
const session = require("express-session");
const passport = require("./passport");
var cors = require("cors");
var express = require('express');
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(cors());
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(express.static(path.join(__dirname, 'public')));
app.use(cookieParser());
// USING SESSION AND PASSPORT
app.use(session({
secret: 'adsdsacoasdqwdn',
resave: false,
saveUninitialized: false,
cookie: { secure: false }
}))
app.use(passport.initialize());
app.use(passport.session());
app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use("/api/admin",serverRouter);
app.use("/api/user",DbRouter);
app.use("/api/product",ProductRouter);
app.use("/api/category",CategoryRouter);
app.use(express.json({ extended:false}));
app.use(function(req, res, next) {
res.header('Access-Control-Allow-Origin', "*");
res.header('Access-Control-Allow-Methods','GET,PUT,POST,DELETE');
res.header('Access-Control-Allow-Headers', 'Content-Type');
next();
})
// catch 404 and forward to error handler
app.use(function(req, res, next) {
next(createError(404));
});
// error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
module.exports = app;
Вот мой файл, в котором я делаю маршруты и создаю сессии:
var express = require("express");
var router = express.Router();
var connectDB = require("./connect");
const passport = require("../passport");
connectDB();
router.post("/adminlogin", (req,res,next) => {
passport.authenticate("local-adminSignin",function(err,user,info){
if(err){
return res.status(500).send(err)
}
req.login(user,function(error){
if(error){
return res.status(500).json(err)
}
return res.json(user);
})
})(req,res,next);
})
router.get("/currentAdmin", (req,res,next) => {
res.json(req.user)
})
module.exports = router;
Здесь, когда я делаю запрос get для "/ currentAdmin" после того, как я вошел в систему как администратор, я должен быть получение пользовательского объекта в качестве ответа, который содержит все данные администратора от mongoDB.
ВХОД В POSTMAN (я не могу публиковать изображения, потому что это новая учетная запись, я связал gyazo ниже):
https://gyazo.com/5569415297fbe7c7178a93634d1506e6
AF ЛОГИН TER, ЗАПРОС НА "/ currentAdmin"
https://gyazo.com/cd2ec99e1ee8f959d0c3874b43b76454
Но, когда я делаю тот же запрос от реакции, он дает мне пустой объект в качестве ответа. Одна вещь, которую я здесь заметил, это то, что куки создаются в почтальоне, и я получаю ответ, но в браузере после входа администратора нет файлов cookie.
МОЙ ИНДЕКС ПАСПОРТА. JS ФАЙЛ
const passport = require("passport");
const User = require("../routes/AdminSchema")
passport.serializeUser(function(user, done) {
console.log('i am serializing the user');
done(null, user.username);
});
passport.deserializeUser(function(username, done) {
console.log('i am de-serializing the user');
User.findOne({username}).lean().exec((err,user) => {
done(err, user);
});
});
//import strategy
const AdminLoginStrategy = require("./AdminLoginStrategy");
passport.use('local-adminSignin',AdminLoginStrategy);
module.exports = passport;
ФАЙЛ СТРАТЕГИИ МОЕГО ВХОДА:
const Strategy = require("passport-local").Strategy;
const User = require("../routes/AdminSchema")
const bcrypt = require("bcryptjs")
const LoginStrategy = new Strategy({passReqToCallback:true},function(req,username,password,done){
User.findOne({username}).lean().exec((err,user) => {
if(err){
return done("db error idk bro",null)
}
if(!user){
return done("user not found!",null)
}
const isPasswordValid = bcrypt.compareSync(password, user.password);
if(!isPasswordValid){
return done("username or password not valid!",null)
}
return done(null,user)
})
})
module.exports = LoginStrategy
PS: Если я отправляю текстовый ответ или другой json из "/ currentAdmin", я получаю его в ответ, но не получаю объект res.user, который я думаю, потому что куки не генерируются в браузере. Как я могу решить эту проблему? Спасибо!