2014-04-26 72 views
4

我遇到了一個問題,當我嘗試使用護照登錄時,頁面不重定向。授權返回true(正確的用戶名,密碼)。護照沒有授權後重定向

我很確定它位於我的validPassword函數中的某處,但我不確定。

登錄路由

app.get('/login', function (req, res) { 
    res.render('login', {}); 
}); 

登錄後

app.post('/login', 
    passport.authenticate('local', { successRedirect: '/', 
            failureRedirect: '/login' })); 

用戶原型

User.prototype.validPassword = function(username, unhashedPassword) { 
    async.waterfall([ 
    function (callback) { 
     User.find({ "username" : username }, function (err, data) { 
     if(err) return handleError(err); 
     callback(null, data); 
     }); 
    }, 
    function (data, callback) { 
     var isGood = passwordHash.verify(unhashedPassword, data[0].password); 
     callback(null, isGood); 
    } 
    ], function (err, result) { 
    return result; 
    }); 
}; 

本地策略

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

有被打印出來給我的控制檯沒有錯誤,所以我稍微感到困惑現在。 isGood是否可能以錯誤的格式返回?任何幫助都會很棒。

+0

是它重定向到科爾ect子域? (127.0.0.1或localhost)? – PSeUdocode

+0

@PSeUdocode如果我在127.0.0.1上,它將重定向到127.0.0.1,本地主機也是如此。會發生什麼是你把你的信息和登錄URL地址欄從'/ login'到'/'回到'/ login'都在同一個序列中,這意味着某些東西沒有授權權。它給了我一個302錯誤,但我的app.post('/ login')'路線顯然在那裏。 – pattmorter

回答

3

我想出了我的問題。問題出在我的本地策略和我的validPassword原型中。

在我的策略,我有一個console.log錯誤,無效的用戶名錯誤,無效的密碼。我還在我的prototype中有console.log打印passwordHash.verify(unhashedPassword, this.password)的評估。

當我貼出登錄控制檯將打印如下:

LOG: valid username (Strategy) 
LOG: invalid password (Strategy) 
LOG: true (Prototype) 

邏輯的流程如下,LOG: true (prototype)應該LOG: invalid password (Strategy)前出現,但它出現之後,這意味着有一個與同步有問題的地方。

那麼,我通過刪除約15行代碼解決了這個問題,現在它像一個漂亮的工具。

這就是我的驗證策略現在的樣子。

User.prototype.validPassword

User.prototype.validPassword = function(unhashedPassword) { 
    return passwordHash.verify(unhashedPassword, this.password); 
}; 

LocalStrategy

passport.use(new LocalStrategy({ 
    usernameField: 'username', 
    passwordField: 'password' 
    }, 
    function(username, password, done) { 
    var unhashedPassword = password; 
    var passedUsername = username; 
    process.nextTick(function() { 
     User.findOne({ username: passedUsername }, function(err, user) { 
     console.log('within local strategy', user); 
     if (err) { 
      console.log('Error:', err); 
      return done(err); 
     } 
     if (!user) { 
      console.log('Incorrect username:'); 
      return done(null, false, { message: 'Incorrect username.' }); 
     } 
     if (!user.validPassword(unhashedPassword)) { 
      return done(null, false, { message: 'Incorrect password.' }); 
     } 
     return done(null, user); 
     }); 
    }); 
    } 
)); 

登錄後

app.post('/login', 
    passport.authenticate('local', { failureRedirect: '/login' }), 
    function(req, res) { 
    res.redirect('/'); 
    });