2014-10-07 119 views
5

根據the documentation,如果我是這樣處理身份驗證請求,我將能夠捕獲成功的嘗試。如何使用nodejs /護照處理未經授權的請求

app.post('/login', 
    passport.authenticate('local'), 
    function(req, res) { 
    // If this function gets called, authentication was successful. 
    // `req.user` contains the authenticated user. 
    res.redirect('/users/' + req.user.username); 
    }); 

但是,像文件說:

默認情況下,如果驗證失敗,護照會返回一個401個Unauthorized狀態作出反應,和任何其他途徑處理程序將不會被調用。如果身份驗證成功,則會調用下一個處理程序,並將req.user屬性設置爲已通過身份驗證的用戶。

我該如何處理未經授權的登錄嘗試?

我知道我可以用自定義中間件來處理它,但有沒有更好的方法?

回答

10

您應該看看passport docs中的自定義回調部分,其中介紹瞭如何覆蓋處理認證請求的內置行爲。您可以編寫一個自定義回調函數,用於服務您從策略中調用的done函數的用途。

app.get('/login', function(req, res, next) { 
    /* look at the 2nd parameter to the below call */ 
    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); 
}); 

再看第二個參數爲passport.authenticate調用,這將作爲您從本地策略調用完成的功能。

查看在下面的代碼中調用完成的函數,該函數爲您爲護照定義的本地策略。您可以根據來自API調用或數據庫操作的響應,根據策略設置各種可用參數,如err,user,info來調用done函數。這些參數將通過passport.authenticate調用上述函數定義進行處理。

passport.use(new LocalStrategy(
    function(username, password, done) { 
    /* see done being invoked with different paramters 
     according to different situations */ 
    User.findOne({ username: username }, function (err, user) { 
     if (err) { return done(err); } 
     if (!user) { return done(null, false); } 
     if (!user.verifyPassword(password)) { return done(null, false); } 
     return done(null, user); 
    }); 
    } 
)); 
+1

謝謝,作品很棒 – Joseph 2016-03-26 12:20:42