3

NodeJS Express、Connect で Passport を使用しています。セッション ストアは 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);
}

}));

認証中にRedisに保存するユーザーオブジェクトのPassportシリアライズとデシリアライズ:

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

1 に答える 1

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");
                });
        }
    };
}
);
于 2013-10-22T08:46:02.673 に答える