2013-03-27 24 views
0

我試圖通過PassportJS獲得一些基本的Google身份驗證。 網絡上的信息量似乎相當有限,我不斷碰到問題,所以我想在這裏嘗試。Google身份驗證:無法將用戶序列化到會話中

我使用的代碼從https://github.com/mattgaidica/twitter-mongo進行了一些修改,將其用於Google OAuth(它不使用Twitter密鑰,它使用passport-google,passport.authenticate('google', ...))。

我一直有這個錯誤結束了:'Error: failed to serialize user into session'

passport.serializeUser(function(user, done) { 
    console.log(user); //does not have the fields we created earlier, user.uid does not exist. 
    done(null, user.uid); 
}); 

的My Passport策略:

passport.use(new GoogleStrategy({ 
    returnURL: "http://localhost:3000/auth/google/callback" 
    }, 
    function(identifier, profile, done) { 
    User.findOne({uid: profile.id}, function(err, user) { 
     if(user) { 
     done(null, user); 
     } else { 
     var user = new User(); 
     user.provider = "google"; 
     user.uid = identifier; 
     user.name = profile.displayName; 
     user.save(function(err) { 
      if(err) { throw err; } 
      done(null, user); 
     }); 
     } 
    }) 
    } 
)); 

這個其他用戶的領域是不一樣的最初創建的,發生了什麼事另一個用戶?

我對這裏發生的事情有點失落,如果有人能讓我知道我在做什麼錯,我會非常感激。

+0

你是如何實施護照戰略的?另外,您使用的是哪個Google Passport插件? – robertklep 2013-03-27 09:44:00

+0

執行護照策略是在上面。不太清楚你的下一個意思。我正在使用「GoogleStrategy = require('passport-google')。策略」 – Jordy 2013-03-27 09:53:41

+0

我有一些可能有用的示例代碼:https://github.com/therealplato/passport-multiauth-demo – Plato 2013-03-27 13:43:22

回答

1

在您的查詢,您可以使用profile.id

User.findOne({uid: profile.id}, function(err, user) { ... }); 

但應該是identifier

另外,您使用的是Passport Google插件的OpenID版本,它比較舊(甚至在節點0.10上無法正常工作)。我建議你改用passport-google-oauth

+0

哦,哇,這個絕招。必須多次閱讀該代碼。 – Jordy 2013-03-27 10:14:14