Пользователь паспорта не установлен в сеансе Express, но доступен при рукопожатии сокетов
Я использую паспорт с NodeJS Express, Connect. Хранилище сеансов - RedisStore. Я использую стратегию Forcedotcom.
Когда я делаю вызов REST на мой сервер Express, я всегда вижу пробел в разделе Passport в req.session. Кроме того, req.user не определен:
{ cookie: ,
_expires: Tue Oct 29 2013 07:38:47 GMT+0000 (UTC),
httpOnly: true,
domain: '.DOMAIN' },
passport: {} }
Тем не менее, пользователь устанавливается на мой объект сокетов socket.handshake.user.
io.set("authorization", passportSocketIo.authorize({
cookieParser: express.cookieParser, //or connect.cookieParser
key: 'expressSid', //the cookie where express (or connect) stores its session id.
secret: expressSecret, //the session secret to parse the cookie
store: sessionStore, //the session store that express uses
fail: function(data, accept) { // *optional* callbacks on success or fail
accept(null, false);
},
success: function(data, accept) {
accept(null, true);
}
}));
Сериализация и десериализация паспорта для объекта пользователя, который я храню в Redis во время аутентификации:
passport.serializeUser(function( user, done ) {
done( null, user.id);
});
passport.deserializeUser(function( id, done ) {
redis.hget("usersf:"+id, "data", function(err, data) {
done( null, JSON.parse(data) );
});
});
Промежуточное ПО Express Connect:
var sessionStore = new RedisStore({
client :redis,
host: rtg.hostname,
port: rtg.port,
db: redisAuth[0],
pass: redisAuth[1],
prefix: 'appsess:'
});
appSecure.use(allowCrossDomain);
appSecure.use(express.cookieParser());
appSecure.use(express.bodyParser());
appSecure.use(express.methodOverride());
appSecure.set('port', port);
appSecure.use(express.session({ secret: expressSecret, store: sessionStore, key:'expressSid', cookie: { maxAge : 604800000, domain:'.DOMAIN'}}));
appSecure.use(passport.initialize());
appSecure.use(passport.session());
appSecure.use(appSecure.router);
appSecure.use(express.static(__dirname + '/public'));
appSecure.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
1 ответ
После перечитывания я понял, что переменная cookie в объекте сеанса пуста, и это может указывать на проблему на стороне клиента. Глядя на мою клиентскую службу AngularJS REST, я понял, что для параметра WithCredentials установлено значение false. Если для этого параметра установлено значение true, файл cookie сеанса был отправлен, а пользователь установил Passport в req.user.
myApp.factory('RESTService',
function ($http) {
return {
get:function (url, callback) {
return $http.get(url, {withCredentials:true}).
success(function (data, status, headers, config) {
callback(data);
}).
error(function (data, status, headers, config) {
console.log("failed to retrieve data");
});
}
};
}
);