node.js - Passport 用户未在 Express session 中设置,但可用于套接字握手

标签 node.js express connect passport.js redistogo

我将 Passport 与 NodeJS Express、Connect 结合使用。 session 存储是 RedisStore。我正在使用 Forcedotcom 策略。

当我对我的 Express 服务器进行 REST 调用时,我总是在 req.session 的 Passport 部分看到空白。此外,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);
}

}));

Passport 序列化和反序列化我在身份验证期间存储在 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 }));

最佳答案

重读后我意识到 session 对象上的 cookie 变量是空白的,这可能表示客户端问题。查看我的客户端 AngularJS REST 服务,我意识到参数 WithCredentials 被设置为 false。将此设置为 true 会导致发送 session 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");
                });
        }
    };
}
);

关于node.js - Passport 用户未在 Express session 中设置,但可用于套接字握手,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19512035/

相关文章:

node.js - 延迟事件直到调用回调 (Node.js)

node.js - Node v0.5.0 pre Socket.IO 在连接时崩溃(与传输无关)

node.js - 实时重新加载失败 - 无法加载资源:net::ERR_CONNECTION_REFUSED

javascript - 将逗号分隔的数字字符串转换为数字

node.js - 如何替换 ObjectId 引用。与来自 MongoDB 的实际对象一起使用(最好在服务器端)?

node.js - 如何在调用socket.emit之前从socket.on获取响应

javascript - 如何将 html 渲染到页面中,但不将整个 View 渲染到 Node.js + Express 应用程序中?

database - 使用 .NET 连接到远程服务器中的 Oracle

javascript - 要求和导入显示不同的行为。为什么会这样?

node.js - 错误 : Reference. 设置失败:第一个参数包含属性中的未定义