2013-02-03 82 views
6

我發現done()方法(或success(),如告訴我的調試器)的第三個參數作爲被稱爲info很好。任何人都可以告訴我什麼值得傳遞給它?Node.js + Passport:done()方法中第三個參數'info'會發生什麼?

編輯

done()方法,我指的是一個我們必須以戰略的回調調用。例如

var passport = require('passport') 
    , LocalStrategy = require('passport-local').Strategy; 

passport.use(new LocalStrategy(
    function(username, password, done) { 
    User.findOne({ username: username }, function (err, user) { 
     if (err) { return done(err); } 
     if (!user) { 
     return done(null, false, { message: 'Incorrect username.' }); 
     } 
     if (!user.validPassword(password)) { 
     return done(null, false, { message: 'Incorrect password.' }); 
     } 
     return done(null, user); 
    }); 
    } 
)); 

該片段從here。正如可以看到的,在某些情況下,message作爲第三個參數傳遞給對象done()。我們如何以路線方式訪問此message

+0

請出示一些示例代碼或爲我們指出了正確的方向。這有點含糊。另外,我看到你給它貼上了標籤,但你的問題從來沒有提到護照,所以我花了一段時間才意識到你在問什麼。 – loganfsmyth

+0

感謝您指出@loganfsmyth!我已經更新了q,請告訴我是否需要更多解釋。 – craftsman

+0

你能告訴你如何調用中間件嗎? – loganfsmyth

回答

8

您應該能夠訪問的第三個參數爲req.authInfo傳遞的信息。

您可以看到處理hereinfo,其中它被分配給authInfo並用於閃存消息。

5

info是一個可選參數,它可以包含附加的用戶信息,諸如角色,用戶簡檔,或授權,可在驗證功能期間已被確定。 這有助於第三方身份驗證策略,因爲一旦用戶成功通過身份驗證,這些有關經過身份驗證的用戶的詳細信息就可以傳遞。否則,你可能不得不在第二次查看它們,這是低效的。

而且如loganfsmyth指出的那樣,info設置爲req.authInfo,以便中間件或路由稍後可以訪問它。

此外,還可以通過registering the transformAuthInfo變換info對象futher,像這樣:

passport.transformAuthInfo(function(info, done) { 
    Client.findById(info.clientID, function (err, client) { 
    info.client = client; 
    done(err, info); 
    }); 
}); 

對於LocalStrategy,您可以see in the verified function這些信息被傳遞到兩個失敗和成功的行動。

因此,您還可以指定typemessage屬性,這些屬性將用於顯示給用戶的閃爍狀態信息消息。 (type默認爲用戶身份驗證時的'成功',否則'錯誤')。

閃存的消息通過request.flash()函數快速2.X工作。 Express 3.x中已刪除 - 如果您需要此功能,建議使用中間件connect-flash

相關問題