2013-12-17 40 views
13

我設置了我認爲最簡單的auth可能 - 一個網站加載在屏幕上登錄,用戶輸入憑據的形式,在提交我使用護照。 JS和Sequelize來檢查證書。大多數這些都是從各種教程或Passport網站本身複製的。 不管我做什麼,改變或嘗試,只要我點擊表單提交按鈕,網站就掛起。在開發工具網絡選項卡中,我只是將/ login的發佈請求顯示爲掛起。更多Passport.js的困境 - 掛在表單提交

爲了消除所有可能的附加問題,我剝離了Sequelize,並使用了硬編碼的用戶,在本地使用示例。不過,對Sequelize來說沒有任何變化,這不是問題所在。

我敢肯定,這是愚蠢的。我已經嘗試了明顯的解決方案,例如確保我的表單正在發送「用戶名」和「密碼」。

我的形式如下:

form(method="post", action="/login") 
    fieldset 
    legend Please Log In 
    label(for="username") Username: 
    input#username(type='text', name="username", autocomplete="off") 
    label(for="password") Password: 
    input#password(type='password', name="password") 
    button#login(type="submit") Log In 

在節點我app.js使用路由器,其中包括這樣的:

var login = require('../app/controllers/login'); 
app.get('/', login.index); 
app.post('/login', login.auth); 

的頁面加載的GET請求確定。在發佈它指向此:

exports.auth = function (req, res, next) { 
    console.log(req.body); 
    passport.authenticate('local', { 
    successRedirect: '/home', 
    failureRedirect: '/', 
    failureFlash: true 
    }); 
}; 

console.log(req.body)出現良好,顯示錶單值,所以我們對這一點很好。但是沒有任何事。這是最後一部分:

passport.use(new LocalStrategy(
    function(username, password, done) { 
    console.log('local strat invoked'); 
    findByUsername(username, function(err, user) { 
     if (err) { return done(err); } 
     if (!user) { return done(null, false, { message: 'Unknown user ' + username }); } 
     if (user.password != password) { return done(null, false, { message: 'Invalid password' }); } 
     return done(null, user); 
    }); 
    } 
)); 

我換出用於Sequelize檢查DB與此findByUsername功能的用戶(複製並從護照GitHub的頁面上輸入後直接粘貼)的代碼,但因爲console.log('本地策略被調用')永遠不會出現,所以在這一點之後我甚至都不會猜測。

還包括passport.serializeUser和passport.deserializeUser,但我無法想象這些問題在我卡住的階段。

任何想法我錯過了什麼步驟來得到這個工作?

回答

27

護照是中間件,如果你在一個路由處理功能嵌入它,你需要調用它:

exports.auth = function (req, res, next) { 
    console.log(req.body); 
    passport.authenticate('local', { 
    successRedirect: '/home', 
    failureRedirect: '/', 
    failureFlash: true 
    })(req, res, next); // <-- NEED TO INVOKE WITH req, res, next 
}; 

,或者更簡單地使用它作爲中間件(這是推薦的方法:

exports.auth = passport.authenticate('local', { 
    successRedirect: '/home', 
    failureRedirect: '/', 
    failureFlash: true 
}); 
+0

調用是問題謝謝!中間件方法我永遠無法完成,所以我需要重新審視它。 – DrHall