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);
  });