2013-10-22 16 views
3

我使用的护照快递的NodeJS,连接。会话存储是RedisStore。我正在使用Forcedotcom策略。Passport用户没有设置Express会话,但可在插座握手

当我做一个REST调用我的Express服务器,我总是看到一个空白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)); 

}); 

}); 

快速连接中间件:

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被发送,并且用户将通过req.user被Passport设置。

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