我注册没有问题,但是尝试登录时,所有页面都会刷新而没有错误消息。
这是登录表单(我正在使用ejs)
<form class="" action="/login" method="post">
<h1>Login</h1>
<div class="EmailAddress">
<input type="text" name="email" placeholder="Email">
</div>
<div class="Password">
<input type="password" name="password" placeholder="Password">
</div>
<div class="Login">
<input type="submit" value="submit">
</div>
</form>
我为两种不同类型的用户创建了两个模型,一个是运营商,一个是客户,它们实际上是相同的,并且可以很好地进行注册。目前,我仅尝试登录客户,所以这里是我的 passport.js 文件:
编辑:我已经根据下面的zerosand1s更新了它,但仍然无法正常工作。
module.exports = function(passport) {
//LocalStrategy
passport.use(
new LocalStrategy(
{ passReqToCallback: true },
{
usernameField: "email",
passwordField: "password"
},
function(req, email, password, done) {
let query = { email: email };
// checking the name in the database against the one submitted on the form
Customer.findOne(query, function(err, customer) {
if (err) throw err;
if (!customer) {
return done(null, false, {
message: "No such password",
type: "error"
});
}
//Match password
bcrypt.compare(password, customer.password, function(err, isMatch) {
if (err) throw err;
if (isMatch) {
return done(null, customer);
} else {
return done(null, false, {
message: "No such password",
type: "error"
});
// if the password isnt an matc return wrong password
}
});
});
}
)
);
};
passport.serializeUser(function(customer, done) {
done(null, customer.id);
});
passport.deserializeUser(function(id, done) {
Customer.findById(id, function(err, customer) {
done(err, customer);
});
});
这里是我的路线文件,用于登录 index.js
// login route
router.get("/login", function(req, res) {
res.render("login", {message: req.flash('error')});
});
// login Process
router.post("/login", function(req, res, next) {
passport.authenticate('local', {
// were using the LocalStrategy used in config/passport file
successRedirect:'../customer/dashboard',
failureRedirect:'/login',
failureFlash: true
})(req, res, next);
});
router.get("/customer/dashboard", function(req, res) {
res.render("customer/dashboard");
});
我认为可能存在问题的唯一地方是我的 app.js 文件:
// Express session
app.use(session({
secret: 'keyboard cat',
resave: true,
saveUninitialized: true,
cookie: { secure: true }
}));
// Express messages middleware
app.use(require('connect-flash')());
app.use(function (req, res, next) {
res.locals.messages = require('express-messages')(req, res);
// setting a global variable called express-messages
next();
});
// Express validator middleware
app.use(expressValidator({
errorFormatter: function(param, msg, value) {
var namespace = param.split('.')
, root = namespace.shift()
, formParam = root;
while(namespace.length) {
formParam += '[' + namespace.shift() + ']';
}
return {
param : formParam,
msg : msg,
value : value
};
}
}));
app.use(function (req, res, next) {
res.locals.messages = require('express-messages')(req, res);
next();
});
// Passport Config
require('./config/passport')(passport);
// Passport Middleware
app.use(passport.initialize());
app.use(passport.session());
app.get('*', function(req, res, next) {
res.locals.customer = req.customer || null;
next();
});
app.use(cookieparser());
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))
// parse application/json
app.use(bodyParser.json())
app.listen(3000, function() {
console.log('server is running');
});
app.use(flash());
app.use(routes);
我整天都在扯头发,因此非常感谢任何帮助
答案 0 :(得分:1)
由于您使用email
进行登录(而不是默认的username
),因此需要在Passport本地策略中进行指定。
从Passport文档中,
默认情况下,LocalStrategy期望在参数中找到凭证 命名的用户名和密码。如果您的网站更喜欢命名这些字段 不同的是,可以使用选项来更改默认值。
passport.use(new LocalStrategy({
passReqToCallback: true
usernameField: 'email',
passwordField: 'passwd'
},
function(username, password, done) {
// ...
}
));