问题描述
我试图摆脱 Firebase 身份验证。 因此,我导出了所有 firebase 用户及其电子邮件、哈希密码、saltKey 以及所有其他必要信息。
毕竟,我将它们迁移到数据库并尝试使用 JWT 和 Express.js 实现身份验证流程。
我所做的是使用 firebase-scrypt npm 来验证 hashedPassword 与从原始 firebase 应用程序中获得的 saltkey 和 firebase auth 配置。
无论我输入什么作为密码,它都被验证为真,我无法使身份验证流程正常工作。
如果有人遇到这个问题并帮助我解决这个问题,我真的很感激。
感谢您仔细查看。
附言下面附上代码
import { FirebaseScrypt } from 'firebase-scrypt';
const hashConfig: FirebaseScryptOptions = {
signerKey: 'xxxx',saltSeparator: 'xxxx',rounds: 8,memCost: 14
};
const scrypt = new FirebaseScrypt(hashConfig);
public async login(req: Request,res: Response) {
const { email,password } = req.body;
try {
const user = await User.findOne({
where: {
email
}
});
const hashedPassword = await scrypt.hash(password,user.salt);
const valid = await scrypt.verify(password,user.salt,hashedPassword);
if (!valid) {
res.status(400).send(AuthError.InvalidPassword);
return;
}
const token = AuthController.createtoken(user.id);
res.setHeader('token',AuthController.createCookie(token));
res.send(user);
} catch (e) {
res.status(400).send(AuthError.UserNotFound);
}
}
解决方法
函数 scrypt.hash(password,user.salt)
不会获取现有的哈希值,但会根据给定的密码和盐生成一个新的哈希值。根据给定的密码生成新的散列后,然后检查给定的密码对该散列是否有效。这始终是正确的,因为始终为输入密码生成哈希:)
因此,您可能应该将行 const hashedPassword = ...
更改为从数据库加载哈希的内容。