首页 > 解决方案 > 使用 Firebase 的 REST Auth API 更改密码

问题描述

我一直在使用Firebase 的 REST Auth API,到目前为止一切都很好。

我正在尝试实现密码更改功能(不是 reset, change),并且我想向用户询问当前密码,对其进行验证,然后允许他们设置新密码。阅读文档,我看到我可以采取两种方法:

  1. 使用密码重新登录并检查 200 返回码。这样做的问题是前一个idToken会过期,我将不得不重置我的 Redux 状态——这还不错。

  2. 我知道我可以获得用户的密码哈希,如果有办法获得 Firebase 的哈希算法,应用它,并与数据库的密码哈希进行比较,我也可以验证密码。这种方法似乎需要做很多工作。

有没有更直接的方法,还是我最好坚持选项 1?

标签: firebasefirebase-authenticationrest

解决方案


方法一:

要求用户输入密码听起来不错,但这是多余的,重置密码的 API 调用不依赖于此。因此,任何人都可以直接发出 API 请求来更改密码。

方法二:

这种听起来对我来说太过分了。此外,您还必须使用scrypt处理复杂的流程,并且仍然存在有人绕过它的机会。

我会采用方法一,但为了防止有人绕过它,我将在云功能中执行密码重置部分。因为您获得的是用户输入密码后刚刚生成的新令牌,所以您可以auth_time在 Cloud 函数中比较令牌创建(属性)的时间戳。如果超过 N 分钟,要求用户再次输入密码。

decoded id token的auth_time属性是自 Unix 纪元以来发生最终用户身份验证的时间,以秒为单位。您还可以使用iat哪个是颁发此 ID 令牌的时间,但该令牌可能属于较旧的会话(当用户未输入密码时)。

然后,您可以使用 Firebase Admin SDK 的updateUser方法更新用户密码。

请注意,这不会阻止从用户已登录的设备获取 ID 令牌的任何人直接使用 REST API 更改密码。这只是获得所需密码更改流程的一种解决方法。防止任何恶意用户对其设备进行物理访问取决于用户。


推荐阅读