Экспресс-сессия не будет сохраняться и не будет отправлять куки в браузер - PullRequest
0 голосов
/ 04 июня 2019

Я работаю над веб-приложением Mern Stack (реагировать, узел, экспресс и mongodb).Я установил экспресс-сессию на node.js.однако в браузере я не вижу cookie-файл connect.sid.Кроме того, кажется, что сеанс не сохраняется между запросами в узле.

Сначала я думал, что это проблема cors (что все еще может иметь место), поэтому я попытался немного изменить заголовки CORS, но безпри удаче.

//this is the main app.js file in node.js

var session = require('express-session')

app.use((req, res, next) => {
    res.header('Access-control-Allow-Origin', '*');
    res.header(
        "Access-Control-Allow-Headers",
        "Origin, X-Requested-With, Content-Type, Accept, Authorization"
    );
    res.header('Access-Control-Allow-Credentials', true);
    if (req.method === 'OPTIONS') {
        res.header('Access-Control-Allow-Methods', 'PUT, POST, PATCH, DELETE, GET');
        return res.status(200).json({});
    }
    next();
});

app.use(session({
    secret: 'keyboard cat',
    resave: false,
    saveUninitialized: true,
    cookie: { secure: false }
}));

//this is the index.js route file in node.js

router.get('/check_if_session_exists_when_refreshing', async (req, res, next) => {
  try {
    res.json(req.session)
  }
  catch (err) {
    console.log(err);
  }
});

router.post('/login', function (req, res, next) {
  UserModel.findOne({ username: req.body.username }).then((data) => {
    bcrypt.compare(req.body.password.toString(), data.password.toString()).then((resp, err) => {
      if (resp) {
        req.session.user = {
          username: req.body.username,
          password: req.body.password
        }
        res.json([data])
      }
      else console.log(err)
    })
  });
});
// this is the React-Redux login action on the client side
import { FETCH_USER } from './types';

export const fetchUser = (userData) => dispatch => {
    fetch("http://localhost:3000/login", {
        method: 'POST',
        headers: { 'content-type': 'application/json' },
        body: JSON.stringify(userData)
    }).then(response => response.json())
        .then(user =>
            dispatch({
                type: FETCH_USER,
                payload: user
            })
        );
};

Ожидаемый результат: постоянный идентификатор сеанса на платформе Express и файл cookie, сохраненный в браузере.

Фактический результат: сеанс не сохраняетсяи cookie не сохраняется.

1 Ответ

0 голосов
/ 05 июня 2019

FIX UPDATE: проблема заключалась в том, что параметры инициализации учетных данных не были установлены в API извлечения.

правильный код должен быть написан так:

// this is the React-Redux login action on the client side

export const fetchUser = (userData) => dispatch => {
fetch("http://localhost:3000/login", {
    method: 'POST',
    headers: { 'content-type': 'application/json' },
    credentials: "include",
    body: JSON.stringify(userData)
}).then(response => response.json())
    .then(user =>
        dispatch({
            type: FETCH_USER,
            payload: user
        })
    );
};

также в настройках CORS подстановочный знак ('*') нельзя использовать в качестве «Access-Control-Allow-Origin». Вместо этого ему нужен адрес отправителя, который в моем случае был http://localhost:3001.

//this is the main app.js file in node.js

app.use((req, res, next) => {
res.header('Access-control-Allow-Origin', 'http://localhost:3001');
res.header(
    "Access-Control-Allow-Headers",
    "Origin, X-Requested-With, Content-Type, Accept, Authorization"
);
res.header('Access-Control-Allow-Credentials', true);
if (req.method === 'OPTIONS') {
    res.header('Access-Control-Allow-Methods', 'PUT, POST, PATCH, DELETE, GET');
    return res.status(200).json({});
}
next();
});

Оглядываясь назад, я уже понял это на относительно ранней стадии. но без моего ведома, сброса nodemon недостаточно после внесения этих изменений. ручное отключение сервера было необходимо для того, чтобы изменения вступили в силу. и для меня это было настоящим препятствием на пути.

...