Express -Сессия генерирует куки в почтальоне, но не в браузерах - PullRequest
1 голос
/ 11 января 2020

Проблема здесь в том, что когда я вхожу с правильными деталями, должен быть создан сеанс и должен быть сгенерирован повар ie на стороне клиента, что происходит, когда я использую почтальон, но не в случае веб-браузеров.

Я использую следующее:

  1. паспорт для аутентификации данных входа в систему из mongoDB с использованием mon goose
  2. express -сессии для создания сеанса при входе пользователя в систему.
  3. 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, который я думаю, потому что куки не генерируются в браузере. Как я могу решить эту проблему? Спасибо!

...