如何检查当前密码在 firebase admin sdk 中是否有效?

How to check if current password is valid in firease admin sdk?

我有一个由 firebase 驱动的应用程序。要求是通过键入 currentPasswordnewPassword.

更新帐户密码

在服务器上(firebase cloud function + admin sdk)我需要检查提供的currentPassword是否有效。

第一次创建帐户时,firebase 会自动加密密码,并且只返回哈希值。

问题是 - 此加密是在幕后自动完成的

在无法访问加密方法的情况下,我无法获得 currentPassword 的散列值,以便将其与存储的真实密码散列值进行比较。以查看这 2 个散列值是否匹配。

那么如何检查 currentPassword 是否有效?如何访问 firebase-auth 用于加密的相同方法?

到目前为止我找不到任何相关内容。我在这里使用错误的方法吗?为什么这么难找?

我不太确定你是否可以使用云功能验证密码,关键是要确保黑客即使以某种方式侵入服务器也无法恢复用户的密码,如果你可以的话通过知道散列和盐来恢复密码,为什么他们不会成为黑客?但是,您可以在您的应用中执行此操作:

firebase.auth().currentUser.reauthenticateWithCredential(firebase.auth.EmailAuthProvider.credential(firebase.auth().currentUser.email, oldPassword);

另外,给想改密码的用户提供一个替代方法,给他们发一封重设密码的邮件,这样很安全,他们不用输入旧密码:

firebase.auth().sendPasswordResetEmail(firebase.auth().currentUser.email)

对于这个用例,我需要实施 2 种不同的方法。

案例 1: agent 更改了自己的密码。 我使用@K.Wu 提供的浏览器代码 - firebase 自动向用户发送密码重置电子邮件。

firebase.auth().sendPasswordResetEmail(firebase.auth().currentUser.email)

案例2:当高权限用户:admin / manager更改agent密码

我使用服务器代码 - firebase admin sdk。这里经理不知道当前密码,也不需要知道,因为 firebase-admin 可以更改帐户密码而无需发送确认电子邮件。

不过,我不感兴趣的是:

当我第一次创建用户时,firebase 给了我一个 userRecord 对象,它有两个属性:passwordHashpasswordSalt。但是既然我不能手动加密给定的密码,那么这两个属性有什么用呢?什么时候需要它们?

我认为它们是专门设计用于比较提供的密码的哈希值 - 与存储在 firebase 中的密码哈希值。好像不是这样的,我还是有点懵

无论如何,如上所述,根据谁执行操作,在客户端和服务器之间拆分密码更新功能 - 非常有效。

注意: 此设置还允许 admin / manager 完成帐户创建。

passwordHash and passwordSalt are only available when you retrieve the user information via a call to listUsers()。因此,它们仅在您将用户数据从 Firebase Auth 迁移到不同的用户管理系统时才有用。

我认为您可以使用 scrypt 检查密码哈希。您需要从帐户下载 scrypt 配置并进行比较。请查看以下文档

https://firebaseopensource.com/projects/firebase/scrypt/

如果在此处找到 scrypt 的 Util 函数用于散列和验证

https://github.com/xeewi/firebase-scrypt

注:只有listUsers()方法才会returnpasswordHashgetUser() 或没有其他函数会 return passwordHash 值。