10

在Facebook上爲nodejs通行證身份驗證回調時,如何獲取回調中的req對象?從回調函數中Passport-Facebook訪問請求對象

passport.use(new FacebookStrategy({ 
    clientID: 123456789, 
    clientSecret: 'SECRET', 
    callbackURL: "http://example.com/login/facebook/callback" 
    }, 
    function(accessToken, refreshToken, profile, done){ 
    // Is there any way to get the req object in here? 
    } 
)); 

回答

15

設置passReqToCallback選項,所以:

passport.use(new LocalStrategy({ passReqToCallback: true }, 
    function(req, username, password, done) { 
    User.findOne({ username: username }, function (err, user) { 
     if (err) { return done(err); } 
     if (!user) { return done(null, false); } 
     if (!user.verifyPassword(password)) { 
     req.flash('error', 'Your password is too long'); 
     req.flash('error', 'Also, it is too short!!!'); 
     return done(null, false); 
     } 
     return done(null, user); 
    }); 
    } 
)); 

req變得驗證回調

的第一個參數按https://github.com/jaredhanson/passport/issues/39

+1

這也適用於我與facebook身份驗證。 – TulioPa 2013-11-12 03:56:00

+0

謝謝!這是一個很大的幫助。 – Tyguy7 2015-04-14 15:26:17

5

我回答是否爲時已晚,但我認爲我的解決方案更好,更傳統。 在官方文檔here。有一節「協會確認回調」,其中提到,如果我們的戰略的passReqToCallback選項設置爲,這使REQ,它將作爲第一個參數驗證傳遞迴電話。

所以我FacebookStrategy現在看起來像:

var User = require('../models/UserModel.js'); 
var FacebookStrategy = require('passport-facebook').Strategy; 

exports.facebookStrategy = new FacebookStrategy({ 
     clientID: 'REPLACE_IT_WITH_CLIENT_ID', 
     clientSecret: 'REPLACE_IT_WITH_CLIENT_SECRET', 
     callbackURL: 'http://localhost:3000/auth/facebook/callback', 
     passReqToCallback: true 
    },function(req,accessToken,refreshToken,profile,done){ 
     User.findOne({ 
       'facebook.id' : profile.id 
      },function(err,user){ 
      if(err){ 
       done(err); 
      } 
      if(user){ 
       req.login(user,function(err){ 
        if(err){ 
         return next(err); 
        } 
        return done(null,user); 
       }); 
      }else{ 
       var newUser = new User(); 
       newUser.facebook.id = profile.id; 
       newUser.facebook.name = profile.displayName; 
       newUser.facebook.token = profile.token; 
       newUser.save(function(err){ 
        if(err){ 
         throw(err); 
        } 
        req.login(newUser,function(err){ 
         if(err){ 
          return next(err); 
         } 
         return done(null,newUser); 
        }); 
       }); 
      } 
     }); 
    } 
); 

在我的代碼示例我已經增加了一些邏輯保存在數據庫中的會話保存用戶信息的用戶信息和。我認爲這可能對人們有幫助。

req.user給出存儲在護照會話中的用戶信息。

+0

謝謝!這是一個很大的幫助。 – Tyguy7 2015-04-14 15:26:20

相關問題