сеанс запроса не постоянен - ​​экспресс-сеанс - PullRequest
0 голосов
/ 27 мая 2019

Я пытаюсь создать сеанс, содержащий данные пользователя, в файле node.js / express FW.Я использую экспресс-сессию.Я еще не пользуюсь магазином сессий.У меня есть 2 страницы в клиенте (угловые), где я перебираю - Логин и Панель инструментов.Идея состоит в том, чтобы создать сеанс после успешного входа в систему, а затем перенаправить на страницу панели инструментов.На странице панели инструментов у меня есть якорь с RouinLink для входа в систему:

<a [routerLink]="['/login']" >BackToLogin</a>  

При возвращении к loginPage (при активации маршрута) я выполняю службу с конечной точкой на сервере экспресс, которыйпроверьте, есть ли в запросе сеанс с запросом (я ожидаю, что он будет). Проблема в том, что я вижу, что сеанс не совпадает с другим (идентификатор меняется)

См. Мой код: Node.js side - файл server.js:

const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const cors = require('cors');

const session = require ('express-session'); 
var cookieParser = require('cookie-parser');
const SESS_NAME = 'sid'; 

app.use(session({
    name:SESS_NAME,
    key: 'user_sid',
    resave:false, 
    saveUninitialized:false, 
    secure: process.env.NODE_ENV ==="production",  
    secret:'<some random text>', 
    cookie:{

            httpOnly: true, 
            secure: process.env.NODE_ENV ==="production", 
            expires: 60000 
           }
}));

app.use(bodyParser.text());
app.use(bodyParser); 
app.use(bodyParser.urlencoded({ 
    extended: true
}));

app.use(cors()); //No limitation for test reasons

app.use(cookieParser());

//disabled on purpose
//var sessionManagement = require('./middleware/sessionManagement'); 
// API   
app.use("/", require("./api/v1/routes.js"))//This file includes:
/*
const express = require('express');
const router = express.Router();
router.use("/login", require('./login'));
router.use("/session", require('./session'));
module.exports = router;
*/
...etc
app.listen(config.port, () => console.log(`Process ${process.pid}: Listening on port ${config.port}`));

login.js на сервере: отвечает за проверку пользователя и сохранение пользовательских данных в сеансе:

const express = require('express');
const router = express.Router();
const schema = require('./objectSchemaJson.schema.json');
const scehmaCheck = require('../../middleware/checkForSchema')(schema);//this is 
a schema check (middleware) - if suceeded continue (next)

const storeSession = (req, dataResult) =>
{
    if (<dataResult return with valid use data>) //This is "where the magic happanes"
    {
        req.session.user = { 
            username: <get userName from dataResult>, 
            ID: <Get ID from dataResult>, 
            Role: <Get Role from dataResult> 
        }    
    }
}
router.use("/", scehmaCheck, (req, res, next) => {
    return GetUserDataFROmDB(req.body).then((dataResult) => { //reaching the DB - not mentioned here on purpose
        storeSession(req, dataResult); // This is where the session set with user data
        res.status(200).json(dataResult);
    }).catch((err) => {
        next({
            details: err
        })
    });
});

module.exports = router;

Это конечная точка на сервере, отвечающая за получение сеанса - session.js - Вот здесь и возникает проблема - у res.session идентификатор сеанса отличается от идентификатора, который я создал после входа в систему

const express = require('express');
const router = express.Router();

 hasSession : function(req, res) //This is where the problem appears - the res.session has a session ID which is different that the one I created after the login
{
    if (req.session.user)
    {
        res.status(200).json(
            {
                recordsets: [{Roles: req.session.Roles, UserName: req.session.user.username}]
            });
    }
    else{
        res.status(200).json({});
    }
}

router.use("/", (req, res, next) => { return sessionManagement.hasSession(req, res, next)});

module.exports = router;

Клиентская сторона:

//HTML:
<div>
  <label>Username:</label>
  <input type="text" name="username" [(ngModel)]="userName" />
</div>
<div>
  <label>Password:</label>
  <input type="password" name="password" [(ngModel)]="password"/>
</div>
<div>
  <button (click)="login()">Login</button>
</div>

//COMPONENT:

login()
  {
    this.srv.login(this.userName, this.password).subscribe(result => 
      {
        if (<result is valid>)
        {
          this.router.navigate(['/dashboard']);
        } 

      }
    );
  }

//This reach the node.js endpoint and routing to the session.js end point - it is executes when the router-outlet activated in the app.component:
/*
    onActivate(componentRef : any)
      {
        if (componentRef instanceof LoginComponent)
        {
          componentRef.getSession();
        }
      }
*/



getSession() : void
  {
    this.sessionService.getSession().subscribe( result => 
      {
        if (<result is valid>)
        {
          this.router.navigate(['/dashboard']);
        }
      });
  } 

Я нашел похожий вопрос на github - решения пока нет: https://github.com/expressjs/session/issues/515, но это может быть проблема конфигурации сервера cookie <->.

1 Ответ

0 голосов
/ 28 мая 2019

Обнаружена проблема - основная причина заключалась в том, что клиент не отправлял куки при создании httprequest.Чтобы решить эту проблему, необходимо сделать 2 вещи: 1. Установите для определения CORS значение creadentials: true вместе с источником (имя хоста клиента, которое, вероятно, имеет другой порт \ имя хоста): app.use (cors ({origin: config.origin, учетные данные: true}));2. Для каждого метода http rest (в моем случае get и post) добавьте свойство withCredentials со значением true: верните this.http.get (, {withCredentials: true}) или верните this.http.post (,, {withCredentials: true})

...