ExpressJS:无法使用 passport.js 登录
ExpressJS: Can't login using passport.js
这是我第一次在 expressJS
项目中使用 passport
。
不过我遇到了一个问题。当我尝试登录时,我正在提交我的数据,但该应用程序始终无法通过身份验证。
我的 app.js
文件包括这些与护照相关的文件:
// Passport Config
require('./config/passport')(passport);
// Login
app.post('/users/login', (req, res, next) => {
passport.authenticate('local', {
successRedirect: '/dashboard',
failureRedirect: '/users/login',
failureFlash: false
})(req, res, next);
});
// Passport middleware
app.use(passport.initialize());
app.use(passport.session());
// Express body parser
app.use(express.urlencoded({ extended: false }));
我还有一个 passport.js
文件,它位于 config
目录中 (/config/passport.js
)
在这个文件中,我创建了我的 LocalStrategy,它负责登录验证的成功或失败。
在 passport.js
文件中我有:
const LocalStrategy = require('passport-local').Strategy;
const bcrypt = require('bcrypt');
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";`
module.exports = function(passport) {
console.log('check if printing-- it is printing')
passport.use(
new LocalStrategy({ usernameField: 'email' }, (email, password, done) => {
console.log('check if printing-- it is not printing')
// Match user
MongoClient.connect(url, function(err, db) {
var dbo = db.db("chat_db");
dbo.collection('users').findOne({
email: email
}).then(user => {
if (!user) {
console.log('That email is not registered');
// return done(null, false, { message: 'That email is not registered' });
}
// Match password
bcrypt.compare(password, user.password, (err, isMatch) => {
if (err) throw err;
if (isMatch) {
return done(null, user);
} else {
return done(null, false, { message: 'Password incorrect' });
}
});
});
})
})
);
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
MongoClient.connect(url, function(err, db) {
var dbo = db.db("chat_db");
dbo.collection('users').findById(id, function(err, user) {
done(err, user);
});
});
})
};
我认为问题存在于代码的 passport.use(...)
部分,但我无法弄清楚。我在代码中放置了两个 console.log()
测试,以检查是否调用了哪些方法。我还测试了 dbo.collection('users').findOne()
部分, 确实 通过提供的电子邮件找到数据,所以我想这没有问题。
谁能帮我解决这个问题?我不知道为什么 passport.use(...)
没有被调用,所以登录总是失败,并且总是将我重定向到登录页面,而不是仪表板。
非常感谢您的帮助,感谢您的宝贵时间。
您在路由后加载 passport/body 解析器中间件,因此它们永远不会被调用以获取您的登录路由。首先需要定义它们。此外,您似乎以不同的方式定义了路线 than the documentation suggests,并且可以这样简化:
// Passport Config
require('./config/passport')(passport);
// Passport middleware
app.use(passport.initialize());
app.use(passport.session());
// Express body parser
app.use(express.urlencoded({ extended: false }));
// Login
app.post('/users/login',
passport.authenticate('local', {
successRedirect: '/dashboard',
failureRedirect: '/users/login',
failureFlash: false
})
);
这是我第一次在 expressJS
项目中使用 passport
。
不过我遇到了一个问题。当我尝试登录时,我正在提交我的数据,但该应用程序始终无法通过身份验证。
我的 app.js
文件包括这些与护照相关的文件:
// Passport Config
require('./config/passport')(passport);
// Login
app.post('/users/login', (req, res, next) => {
passport.authenticate('local', {
successRedirect: '/dashboard',
failureRedirect: '/users/login',
failureFlash: false
})(req, res, next);
});
// Passport middleware
app.use(passport.initialize());
app.use(passport.session());
// Express body parser
app.use(express.urlencoded({ extended: false }));
我还有一个 passport.js
文件,它位于 config
目录中 (/config/passport.js
)
在这个文件中,我创建了我的 LocalStrategy,它负责登录验证的成功或失败。
在 passport.js
文件中我有:
const LocalStrategy = require('passport-local').Strategy;
const bcrypt = require('bcrypt');
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";`
module.exports = function(passport) {
console.log('check if printing-- it is printing')
passport.use(
new LocalStrategy({ usernameField: 'email' }, (email, password, done) => {
console.log('check if printing-- it is not printing')
// Match user
MongoClient.connect(url, function(err, db) {
var dbo = db.db("chat_db");
dbo.collection('users').findOne({
email: email
}).then(user => {
if (!user) {
console.log('That email is not registered');
// return done(null, false, { message: 'That email is not registered' });
}
// Match password
bcrypt.compare(password, user.password, (err, isMatch) => {
if (err) throw err;
if (isMatch) {
return done(null, user);
} else {
return done(null, false, { message: 'Password incorrect' });
}
});
});
})
})
);
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
MongoClient.connect(url, function(err, db) {
var dbo = db.db("chat_db");
dbo.collection('users').findById(id, function(err, user) {
done(err, user);
});
});
})
};
我认为问题存在于代码的 passport.use(...)
部分,但我无法弄清楚。我在代码中放置了两个 console.log()
测试,以检查是否调用了哪些方法。我还测试了 dbo.collection('users').findOne()
部分, 确实 通过提供的电子邮件找到数据,所以我想这没有问题。
谁能帮我解决这个问题?我不知道为什么 passport.use(...)
没有被调用,所以登录总是失败,并且总是将我重定向到登录页面,而不是仪表板。
非常感谢您的帮助,感谢您的宝贵时间。
您在路由后加载 passport/body 解析器中间件,因此它们永远不会被调用以获取您的登录路由。首先需要定义它们。此外,您似乎以不同的方式定义了路线 than the documentation suggests,并且可以这样简化:
// Passport Config
require('./config/passport')(passport);
// Passport middleware
app.use(passport.initialize());
app.use(passport.session());
// Express body parser
app.use(express.urlencoded({ extended: false }));
// Login
app.post('/users/login',
passport.authenticate('local', {
successRedirect: '/dashboard',
failureRedirect: '/users/login',
failureFlash: false
})
);