我有一个基于firebase的应用程序。要求输入currentPassword
和newPassword
更新帐户密码。
在服务器(firebase云功能+ admin sdk)上,我需要检查提供的currentPassword
是否有效。
首次创建帐户时, firebase会自动加密密码,并仅返回哈希值。
问题是 - 此加密是在封面下自动完成的。
如果无法访问加密方法,我无法获取currentPassword
的哈希值,以便将其与真实密码的存储哈希值进行比较..以查看此2哈希值是否匹配。
那么如何检查currentPassword
是否有效?如何访问firebase-auth用于加密的相同方法?
到目前为止,我还没有发现任何相关内容。我在这里使用错误的方法吗?为什么这么难找?
答案 0 :(得分:1)
我不太确定您是否可以使用云功能验证密码,重点是确保黑客无法恢复用户的密码,即使他们以某种方式入侵服务器,如果您可以恢复通过了解哈希和盐的密码,他们为什么不是黑客?但是,您可以在自己的应用中执行此操作:
firebase.auth().currentUser.reauthenticateWithCredential(firebase.auth.EmailAuthProvider.credential(firebase.auth().currentUser.email, oldPassword);
另外,只是为想要更改密码的用户提供替代方法,只需向他们发送重置密码电子邮件,这样就非常安全,他们不必输入旧密码:
firebase.auth().sendPasswordResetEmail(firebase.auth().currentUser.email)
答案 1 :(得分:1)
passwordHash
检索用户信息时, passwordSalt
和listUsers()
才可用。因此,只有将用户数据从Firebase Auth迁移到其他用户管理系统时,它们才有用。
答案 2 :(得分:0)
对于这个用例,我需要实现两种不同的方法。
当agent
更改自己的密码时,案例1 。 我使用@ K.Wu提供的浏览器代码 - firebase自动向用户发送密码重置电子邮件。
firebase.auth().sendPasswordResetEmail(firebase.auth().currentUser.email)
案例2 :高权限用户:admin / manager
更改agent
密码
我使用服务器代码 - firebase admin sdk。在这里,经理不知道currentPassword,并且不需要知道,因为firebase-admin
可以更改帐户密码,而无需发送确认电子邮件。
不过,我不感兴趣的是:
当我第一次创建用户时,firebase会为我提供一个userRecord
对象,该对象包含2个属性:passwordHash
和passwordSalt
。但由于我无法手动加密给定的密码,那么这2个属性的用途是什么?他们什么时候需要?
我认为它们是专门为比较提供的密码的哈希值而设计的 - 与存储在firebase中的密码哈希值。似乎情况并非如此,我仍然感到困惑。
无论如何,根据执行操作的人在客户端和服务器之间拆分密码更新功能,如上所述 - 像魅力一样工作。
注意:此设置也允许admin / manager
创建帐户。
答案 3 :(得分:0)
我认为您可以使用scrypt
来检查密码哈希。您需要从帐户下载scrypt
配置并进行比较。请检查以下文档
https://firebaseopensource.com/projects/firebase/scrypt/
如果在此处找到scrypt
的实用函数以进行哈希和验证
https://github.com/xeewi/firebase-scrypt
注意:只有listUsers()
方法会返回passwordHash
。 getUser()
或没有其他函数将返回passwordHash
的值。