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)
}