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函數,稱爲用戶名和密碼,就像護照本地期望的一樣
你能幫助我嗎?
我很困惑。我讀過的每個教程都是通過mongoose(findOne方法)完成的查詢創建一個用戶對象。唯一的必要條件是生成的對象有兩個字段:用戶名和密碼。例如,如果db上的字段被稱爲email,我可以用正確的語法覆蓋usernameField。所以我創造了最簡單的對象:2個屬性,用戶名和密碼。 done方法對於第一個參數爲null,而對於第二個用戶對象爲null。 – maephisto
@ user3757063,我不知道我理解你的問題。你能重新表述嗎?如果您想使用電子郵件而不是用戶名,那麼您必須在上面的app.post中發送{usernameField:「email」}的選項。 – Yousef