首页 > 解决方案 > Firebase 身份验证迁移

问题描述

我试图摆脱 Firebase 身份验证。所以我用他们的电子邮件、hashedPassword、saltKey 和所有其他必要信息导出了所有 firebase 用户。

毕竟,我将它们迁移到数据库并尝试使用 JWT 和 Express.js 实现身份验证流程。

我所做的是使用firebase-scrypt npm 使用从原始 firebase 应用程序获得的 saltkey 和 firebase auth 配置验证 hashedPassword。

无论我输入什么密码,它都被验证为真的,我无法让身份验证流程正常工作。

如果有人遇到这个问题并帮助我解决这个问题,我真的很感激。

感谢您仔细查看。

下面附上ps代码

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

标签: javascriptnode.jsfirebase-authenticationscrypt

解决方案


该函数scrypt.hash(password, user.salt)不会获取现有的哈希值,但它会根据给定的密码和盐生成一个新的哈希值。根据给定密码生成新哈希后,您可以检查给定密码是否对该哈希有效。这总是正确的,因为哈希总是为输入密码生成:)

因此,您可能应该将该行更改为const hashedPassword = ...从数据库加载哈希的内容。


推荐阅读