hapi.js 上的散列密码无效

Hashing password on hapi.js is not working

在我的数据库中,密码是使用散列法存储的。但是当我尝试发送纯密码以与 db 上存储的密码进行比较时,它不起作用。我正在使用 bcrypt npm 来散列密码。我正在使用 hapi.js 服务器。

//user authentication
const validate = async (req, username, password, reply) => {

const user = await usermodel.findOne({username, password}).exec(); 

const match = await bcrypt.compare(password, user.password);

if(match) {
    let isValid = username === user.username;
    return isValid;
}
   return { 
         isValid: isValid, 
    };
 };

const init = async () => {

try {
   await server.register(auth);
   server.auth.strategy('simple', 'basic', {validate});
   server.auth.default('simple');

  await server.start();
  console.log('Server running at:', server.info.uri);
   } catch (err) {
    console.log(err);
   }
 };

 init();

但不幸的是,每次我输入密码时,我都会收到此错误:

Debug: internal, implementation, error TypeError: Cannot read property 'password' of null

Debug: internal, implementation, error TypeError: Cannot read property 'username' of null

 usermodel.findOne({username, password})

这不会匹配任何用户,因为您用于搜索的 password 是未加密的,而数据库中的是加密的。而是只搜索用户名,如果找不到则提前退出:

const user = await usermodel.findOne({ username }).exec(); 
if(!user) return { isValid: false };

先对密码进行哈希处理,然后运行您的查询:

const validate = async (req, username, password, reply) => {
  const pwHash = await bcrypt.hash(password);
  const user = await usermodel.findOne({ username, password: pwHash }).exec();
  return user !== null;
};

无需进一步检查。 findOne() 命令将遍历所有用户,return 是 usernamepassword 字段的第一个匹配项,如果没有匹配项,则 null。 这意味着如果行 return 是 user,那么 username === user.usernamepwHash === user.password 隐式地 .

如果在数据库中找到匹配项,最后一行将 return true,如果未找到匹配项,则为 false