Sails.js Node server req.session всегда пуст, используя паспорт-локальную стратегию.

У ember-приложения работает на http://localhost:4200.
Приложение Sails работает на http://localhost:1337.

У меня есть политика, установленная в предрегистрационном опросе. Итак, на стороне парусов в /api/controllers/ProcessSurveyController.js у меня есть следующее:

module.exports = {

    process_survey: function(req, res){
        if(req.body === {} || req.body === null){
            res.status(400);
            return res.send({err: "something bad happened"});
        }
        var params = req.body;
        req.session.user = {};
        if(params.p_1 === '1' && params.p_2 === '1' && params.p_3 === '0' && params.p_4 !== "Bad Param"){
            req.session.user.qualifies = true;
            res.status(200);
            return res.send({message: 'user qualifies', status: 'good'});   
        }else{
            req.session.user.qualifies= false;
            res.status(200);
            return res.send({message: "user fails to qualify", status: "bad"});
        }
    }
};

Затем я использую эту политику в api/policies/Qualifies.js

module.exports= function(req, res, next){
    if(req.session.user.qualifies){
        return next();
    }else{
        res.status(400);
        return res.send({status: 400, message: 'User does not qualify.'});
    }
};

Что я применил к моему api/UserController.js

Единственное, что когда я отправляю сообщение из Ember в мой метод UserController.create, я получаю сообщение об ошибке из этой политики, говоря cannot read property qualifies of undefined.

И если я sails.log.verbose(req.session), он всегда пуст в этой точке. Независимо от того, что я делаю.

Я включил cors на моем сервере, а мой /config/cors.js имеет следующие параметры:

module.exports.cors = {
   allRoutes: true,

   origin: 'http://localhost:4200',

   credentials: true,

   methods: 'GET, POST, PUT, DELETE, OPTIONS, HEAD',

   headers: 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept'
};

В моем адаптере ember у меня есть это:

export default DS.RESTAdapter.extend({
    host: 'http://localhost:1337',
    ajax: function(url, method, hash){
        hash.crossDomain = true;
        hash.xhrFields = {withCredentials: true};
        return this._super(url, method, hash);
    }
});

Ясно, что я пропускаю что-то важное, но я просто не знаю, что, и у меня закончились идеи для запросов Google. Почему мой req.session всегда пуст?

РЕДАКТИРОВАТЬ: Они были запрошены в комментариях:

Содержимое /config/http.js:

module.exports.http = {
    middleware: {
        passportInit: require('passport').initialize(),
        passportSession: require('passport').session(),

        order: [
            'startRequestTimer',
            'cookieParser',
            'session',
            'passportInit',
            'passportSession',
            'myRequestLogger',
            'bodyParser',
            'handleBodyParserError',
            'compress',
            'methodOverride',
            'poweredBy',
            '$custom',
            'router',
            'www',
            'favicon',
            '404',
            '500'
        ]
}

И /config/session.js

module.exports.session = {
  secret: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',

  cookie: {
    maxAge: 48 * 60 * 60 * 1000
  }
}

Ответы

Ответ 1

Я сомневаюсь, что это все еще проблема, так как она такая старая, но времена в моих приложениях ExpressJS, где я использую экспресс-сессию (https://github.com/expressjs/session) и должны явно вызвать req.session.save(обратный вызов), чтобы сеанс сохранялся обратно в хранилище, которое я использую. Если есть эквивалент в поддержке паспортного сеанса, вы можете попытаться вызвать его явно после обновления значений в сеансе.

Ответ 2

Вам нужно добавить Get в пользовательский контроллер.

Итак, например,

вместо:

process_survey: function(req, res){
         console.log(req.session)
}

напишите:

"Get process_survey": function(req, res){
         console.log(req.session)
}