Angular 7 / Express Session не сохраняется - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть приложение Angular 7, подключающееся к бэкэнду Express API, и сеанс, похоже, не сохраняется.

В Express у меня есть следующая конечная точка:

router.get('/getsession', function(req, res) {
    console.log(`Session ID: ${req.session.id}`);
    res.status(200).json({ sessionid: req.session.id });
});

ВотПример выходных данных для двух последовательных прогонов /getsession:

Идентификатор сеанса: NMi8AXhX1wf9xui0WDFwENZ_3QON_iYN

Идентификатор сеанса: pNWcPTeJVlC8rKySw6ty5M * * 113S * 1013Exs9Заголовок учетных данных для Express, поэтому он примет его:

const cors = require("cors"); 
app.use(cors({
  credentials: true,
}));

И я также включил withCredentials для Angular HttpClient, чтобы он отправлял cookie вместе с запросом POST:

API_URL: string = "http://localdev.com:4200/api";
options = {
  headers: new HttpHeaders({
    'Content-Type' : 'application/json',
    'Cache-Control': 'no-cache',
    'Credentials': 'same-origin'
  }),
  withCredentials: true,
}

getSessionInfo() {
  return this.http.get(`${this.API_URL}/users/getsession`, { withCredentials: true })
  .pipe(
    catchError(this.handleError)
  )
}

Существует угловой прокси от localhost:4200 до localhost:4044, поэтому запросы API могут быть обработаны.

Любая помощь будет оценена, спасибо заранее:)

РЕДАКТИРОВАТЬИнтересно, что cookie-файл правильно передается в Express, однако он создает новый сеанс для каждого запроса.Следующее является результатом req.session при вызове конечной точки /getsession.

{'if-none-match': 'W / "b8-afvqPuftgTLN3Wn5o / ZQx8jUsv0"',

cookie: '_ga = GA1.2.1851469997.1544357368;_gid = GA1.2.1246771476.1544357368;_gat_gtag_UA_99682244_1 = 1 ',

' accept-language ':' en-US, en; q = 0,9, bg; q = 0,8, mt; q = 0,7 ',

' accept-кодировка ':' gzip, deflate ',

referer:' http://localdev.com:4200/user/register',

'user-agent': 'Mozilla / 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit / 537.36 (KHTML, как Gecko) Chrome / 71.0.3578.80 Safari / 537.36 ',

принимает:' application / json, текст / обычный, / ',

соединение:'закрыть ',

хост:' localdev.com:4044 '}

ID сеанса: XWKGlJPrzYeRBU3Hi7RIAaWpowGU6Fuz

{' if-none-match ':' W / "b8-mMGAHD1Tmbv1r5T + YChLkQoq988 "',

cookie:' _ga = GA1.2.1851469997.1544357368;_gid = GA1.2.1246771476.1544357368;_gat_gtag_UA_99682244_1 = 1 ',

' accept-language ':' en-US, en; q = 0,9, bg; q = 0,8, mt; q = 0,7 ',

' accept-кодировка ':' gzip, deflate ',

referer:' http://localdev.com:4200/user/register',

'user-agent': 'Mozilla / 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit / 537.36 (KHTML, как Gecko) Chrome / 71.0.3578.80 Safari / 537.36 ',

принимает:' application / json, текст / обычный, / ',

соединение:'close ',

хост:' localdev.com:4044 '}

ID сеанса: T4SnSqGfo9lOWGpiyPQS0LLJgXsRnZ4T

1 Ответ

0 голосов
/ 09 декабря 2018

Разобрался.При работе в среде разработчика без SSL-сертификата cookie-файл отправляется правильно с указанной выше конфигурацией, однако вам также необходимо установить для cookie-файла значение безопасности false, чтобы его можно было использовать.

следующим образом:

let sessionMiddleware = session({
    secret: 'mysecret',
    saveUninitialized: true,
    resave: true,
    cookie: { secure: false },
    store: new MemcachedStore({
        hosts: ['127.0.0.1:11211'],
    })
});
...