8

Facebook からの最初の正常なログインと、passport-facebook 1.0.3 および express 4.6.1 を使用したログイン リダイレクト コールバックの後、req.session.passport および req.user には、シリアル化呼び出し中に設定された値が含まれます (これは戦略から取得します)。しかし、サイト上の異なるルートへのその後の訪問では、req.session.passport と req.user は空白であり、req.isAuthenticated() は false を返すため、FB からの最初のログインが成功した後、他のすべてのルートでの ensureAuthentication メソッドは失敗します。私はクラスターセットアップを使用していないので、メモリストアはこれを処理するのに十分であると信じています。エクスプレス構成は問題ないようです(つまり、順序)、これが私のエクスプレス構成です

configExpressApp.set('views',  './views');
configExpressApp.set('view engine', 'jade');
configExpressApp.use(morgan('dev'));
configExpressApp.use(cookieParser());
configExpressApp.use(bodyParser.urlencoded({
  extended: true,
}));
configExpressApp.use(bodyParser.json());
configExpressApp.use(expressSession({
  secret:'MyExpressSecret', 
  saveUninitialized: true,
  resave: true
}));
configExpressApp.use(passport.initialize());
configExpressApp.use(passport.session());
configExpressApp.use(methodOverride());
configExpressApp.use(express.static('./public'));   

これは、最初の成功したログインとリダイレクトの req.session オブジェクトです。req.user には、req.session.passport.user と同じデータが含まれています。

{ cookie: 
   { path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true },
  passport: 
   { user: 
      { _id: 53ce23e3121421f229a438f8,
        info: false,
        loginType: 'fb',
        fbId: 'MyId',
        name: 'Karthic Rao',
        email: 'kartronics85@yahoo.com'

        }
     }
} 

これは、以前に戦略内およびシリアライゼーション呼び出し内の done() コールバックに関連付けた情報です。ログインとコールバックが成功した後、 res.redirect を使用してユーザーを別のルートにリダイレクトしますが、そのルートからのリクエストにはセッションIDが含まれています(セッションストアの問題ではないと思います)が、req.userフィールドは存在しません (passport.initialize() および Passport.session() ミドルウェアが認証される要求を見つけられないためである可能性があります) および req.session.passport フィールドは空です。req の console.log からの詳細は次のとおりです。物体 。

sessionID: 'I9R1c3PIYgDW5OpWbNT7qb02Hn4lOeAB',
session: 
   { cookie: 
      { path: '/',
        _expires: null,
        originalMaxAge: null,
        httpOnly: true },
     passport: {} },

これが私の逆シリアル化方法です

passport.deserializeUser(function(user, done) {
    console.log('deserialize loginType facebook');
    db.collection("users").findOne({
        fbId: user.id
    }, function(err, docs) {
        console.log(docs);
        done(err, docs);
    });
});

ここに私のシリアライズ方法があります

passport.serializeUser(function (user, done) { 
    console.log(user);
    done(null, user);
});

これは私の開発に大きな障害を引き起こしています。どうすればこれを整理できますか??

4

1 に答える 1