Passport LocalStrategy 不处理错误的凭据
Passport LocalStrategy not handling bad credentials
我正在尝试使用 Passport.js LocalStrategy 设置基本身份验证,但我被重新路由到 successRedirect (res.redirect('../public/index.html')
即使在登录表单中输入了错误的 username/password。
我的 db.query()
调用在其他路由上返回了正确的结果,所以我认为问题出在代码的另一部分,但我现在看不出哪里。
我对在 LocalStrategy 中使用“用户”与“用户名”的理解是模糊的,这可能是问题所在?
如果有人能够发现问题,我将不胜感激。
(请注意,我已经剥离了下面的代码片段以删除散列和 crypto/bcrypt 功能,只是为了在实施一些基本安全方法之前让骨架正常工作)
const express = require('express');
const loginRouter = express.Router();
const path = require('path');
const passport = require('passport');
const session = require('express-session');
const LocalStrategy = require('passport-local');
const db = require('../db/db');
// Define session (update secret to env variable once working).
loginRouter.use(
session({
secret: "D53gxl41G",
resave: false,
saveUninitialized: false,
})
);
loginRouter.use(passport.initialize());
loginRouter.use(passport.session());
passport.use(new LocalStrategy(function (username, password, done) {
db.query('SELECT * FROM customers WHERE username = ', [username], function(err, user) {
if (err) return done(err);
if (!user) return done(null, false);
if (user.password != password) return done(null, false);
return done(null, user);
});
})
);
// GET log in page
loginRouter.get('/', (req, res, next) => {
res.status(200).sendFile(path.resolve('./public/auth.html'));
});
// POST form submission w/passport authentication. Not showing errors even with incorrect username/passwords.
loginRouter.post('/', passport.authenticate('local',
{ failureRedirect: '/' }),
(req, res) => {
res.redirect('../public/index.html');
}
);
module.exports = loginRouter;
SELECT 将 return 一个对象。该对象有一个 属性 rows 列出数据库中任何匹配的行。在您的代码中,该对象是 user。要获得与 SELECT 查询匹配的一项,您可以执行 user.rows[0]。比较密码:
if (user.rows[0].password != password) return done(null, false);
我建议您将用户重命名为 res 然后创建一个变量,例如:
db.query('SELECT * FROM customers WHERE username = ', [username], function (err, res) {
const user = res.rows[0]
if (err) return done(err);
if (!user) return done(null, false);
if (user.password != password) return done(null, false);
return done(null, user);
});
我正在尝试使用 Passport.js LocalStrategy 设置基本身份验证,但我被重新路由到 successRedirect (res.redirect('../public/index.html')
即使在登录表单中输入了错误的 username/password。
我的 db.query()
调用在其他路由上返回了正确的结果,所以我认为问题出在代码的另一部分,但我现在看不出哪里。
我对在 LocalStrategy 中使用“用户”与“用户名”的理解是模糊的,这可能是问题所在?
如果有人能够发现问题,我将不胜感激。
(请注意,我已经剥离了下面的代码片段以删除散列和 crypto/bcrypt 功能,只是为了在实施一些基本安全方法之前让骨架正常工作)
const express = require('express');
const loginRouter = express.Router();
const path = require('path');
const passport = require('passport');
const session = require('express-session');
const LocalStrategy = require('passport-local');
const db = require('../db/db');
// Define session (update secret to env variable once working).
loginRouter.use(
session({
secret: "D53gxl41G",
resave: false,
saveUninitialized: false,
})
);
loginRouter.use(passport.initialize());
loginRouter.use(passport.session());
passport.use(new LocalStrategy(function (username, password, done) {
db.query('SELECT * FROM customers WHERE username = ', [username], function(err, user) {
if (err) return done(err);
if (!user) return done(null, false);
if (user.password != password) return done(null, false);
return done(null, user);
});
})
);
// GET log in page
loginRouter.get('/', (req, res, next) => {
res.status(200).sendFile(path.resolve('./public/auth.html'));
});
// POST form submission w/passport authentication. Not showing errors even with incorrect username/passwords.
loginRouter.post('/', passport.authenticate('local',
{ failureRedirect: '/' }),
(req, res) => {
res.redirect('../public/index.html');
}
);
module.exports = loginRouter;
SELECT 将 return 一个对象。该对象有一个 属性 rows 列出数据库中任何匹配的行。在您的代码中,该对象是 user。要获得与 SELECT 查询匹配的一项,您可以执行 user.rows[0]。比较密码:
if (user.rows[0].password != password) return done(null, false);
我建议您将用户重命名为 res 然后创建一个变量,例如:
db.query('SELECT * FROM customers WHERE username = ', [username], function (err, res) {
const user = res.rows[0]
if (err) return done(err);
if (!user) return done(null, false);
if (user.password != password) return done(null, false);
return done(null, user);
});