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 是 username
和 password
字段的第一个匹配项,如果没有匹配项,则 null
。
这意味着如果行 return 是 user
,那么 username === user.username
和 pwHash === user.password
隐式地 .
如果在数据库中找到匹配项,最后一行将 return true
,如果未找到匹配项,则为 false
。
在我的数据库中,密码是使用散列法存储的。但是当我尝试发送纯密码以与 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 是 username
和 password
字段的第一个匹配项,如果没有匹配项,则 null
。
这意味着如果行 return 是 user
,那么 username === user.username
和 pwHash === user.password
隐式地 .
如果在数据库中找到匹配项,最后一行将 return true
,如果未找到匹配项,则为 false
。