2016-04-10 13 views
5

passport.jsを使用すると、この方法でルートを書き込むため、MongoDbドキュメントuserDocにアクセスできます。しかし、このようにすると... passport.serializeUser()は決して呼び出されず、reqオブジェクトにはuserがありません。このauthenticate()コールバックでPassportのserializeUser()が呼び出されない

auth.route('/auth/facebook/callback') 
    .get(function(req, res, next) { 
    passport.authenticate('facebook', function(err, userDoc, info) { 
     if (err) { return next(err); } 
     // I don't think !userDoc will ever happen because of mongo upsert 
     if (!userDoc) { return res.redirect('/login'); } 
     res.cookie('facebookPicUrl', userDoc.value.facebook.picture, {maxAge : 9999999, 
     httpOnly: false, 
     secure: false, 
     signed: false 
     }); 

     res.redirect('http://localhost:9000/users') 
    })(req, res, next); 
    }); 

しかし、私はそれをこのように書いた場合、それがあるべきよう、req.userがある:

auth.route('/auth/facebook/callback') 
    .get(passport.authenticate('facebook', { failureRedirect: '/login' }), 
     function(req, res) { 
     res.redirect('http://localhost:9000/users') 
    }); 

どのように私はpassport.serializeUserreqで呼び出されるとuserが存在する場合にこれを行うことができますし、私も持っていますmongoDbオブジェクトへのアクセス?

答えて

9

カスタム認証コールバックを使用しているため、セッションを確立する責任があります。

カスタムコールバックを使用した場合、それは(req.login()を呼び出すことで)セッションを確立するために、アプリケーションの 責任になることに注意してくださいと 応答を送信します。

req.login()ログイン操作が完了するとreq.userよう要求オブジェクトreqからuserオブジェクトを割り当てます。

あなたはドキュメントreq.login()で明示的にカスタムコールバックで呼び出された例を参照することができます

app.get('/login', function(req, res, next) { 
    passport.authenticate('local', function(err, user, info) { 
    if (err) { return next(err); } 
    if (!user) { return res.redirect('/login'); } 
    req.logIn(user, function(err) { 
     if (err) { return next(err); } 
     return res.redirect('/users/' + user.username); 
    }); 
    })(req, res, next); 
}); 
+0

うわー!私が理解する限り、これはPassport.jsのウェブサイトには記載されていません。彼らはpassport.authenticate()がreq.login()を呼び出していると言いますが、私はカスタムコールバックを提供する場合、手動で呼び出さなければならないことに気づいていませんでした。ドキュメントは非常に曖昧です! – OzzyTheGiant

関連する問題