2014-07-10 48 views
2

我見過類似的問題,但我找不到正確的答案。Nodejs Passport身份驗證回調沒有被調用沒有錯誤

我試圖用nodejs + express +護照(本地策略)實現一個非常簡單的登錄表單。事情是,我的身份驗證回調似乎總是失敗。我已經移除了測試數據庫的每個連接(每個教程都有一個MongoDB示例)。

這是我的登錄表單

<html> 
    <body> 
    <form action="/login" method="post"> 
     <div> 
     <label>Username:</label> 
     <input type="text" name="username" /> 
     <br/> 
     </div> 
     <div> 
     <label>Password:</label> 
     <input type="password" name="password" /> 
     </div> 
     <div> 
     <input type="submit" value="Submit" /> 
     </div> 
    </form> 
    </body> 
</html> 

這是我server.js(我與故宮開始運行)

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

var app  = express(); 
var port = process.env.PORT || 8080; 

app.use(passport.initialize()); 
app.use(passport.session()); 

passport.use(new LocalStrategy(function(username, password, done) { 
     // no authentication logic here... just return done with an object with 2 fields 
     return (done, {username : username, password : password}); 
})); 

passport.serializeUser(function(user, done) { 
    done(null, user); 
}); 

passport.deserializeUser(function(obj, done) { 
    done(null, obj); 
}); 

// ROUTES 
// ============================================== 

// sample route with a route the way we're used to seeing it 

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

app.get('/login', function(req, res) { 
    res.sendfile('views/login.html'); 
}); 

app.get('/loginFailure', function(req, res, next) { 
    res.send('Failed to authenticate'); 
}); 

app.get('/loginSuccess', function(req, res, next) { 
    res.send('Successfully authenticated'); 
}); 

// START THE SERVER 
// ============================================== 
app.listen(port); 

console.log('Magic happens on port ' + port); 

我總是得到驗證失敗的消息。就像我所說的,我已經用貓鼬將與模式/模型有關的每個代碼都剝離出來,以讀取來自示例MongoDB的數據。 passport.authenticate回調只是返回帶有2個字段的對象的done函數,稱爲用戶名和密碼,就像護照本地期望的一樣

你能幫助我嗎?

回答

3

我不相信你正在調用回調: 第一個param需要一個錯誤或null,第二個需要false或用戶對象。

passport.use(new LocalStrategy(function(username, password, done) { 
    // no authentication logic here... just return done with an object with 2 fields 
    done(null, {username : username, password : password}); 
})); 

,或者使用DB:

passport.use(new LocalStrategy(function(username, password, done) { 
    db.users.findOne({ username : username}, function(err, user){ 
     if(err) return done(err); 
     if(!user || user.password !== password) return done(null, false); 
     done(null, user); 
    }); 
}); 

在這裏你可以看到,我們與用戶對象,然後把它用護照LIB連接到req.user響應之前比較密碼。當然,你不會比較兩個密碼,而是使用bcrypt或類似的哈希。

+0

我很困惑。我讀過的每個教程都是通過mongoose(findOne方法)完成的查詢創建一個用戶對象。唯一的必要條件是生成的對象有兩個字段:用戶名和密碼。例如,如果db上的字段被稱爲email,我可以用正確的語法覆蓋usernameField。所以我創造了最簡單的對象:2個屬性,用戶名和密碼。 done方法對於第一個參數爲null,而對於第二個用戶對象爲null。 – maephisto

+0

@ user3757063,我不知道我理解你的問題。你能重新表述嗎?如果您想使用電子郵件而不是用戶名,那麼您必須在上面的app.post中發送{usernameField:「email」}的選項。 – Yousef

相關問題