firebase:admin.auth().updateUser() 导致 auth/user-token-expired

Posted

技术标签:

【中文标题】firebase:admin.auth().updateUser() 导致 auth/user-token-expired【英文标题】:firebase: admin.auth().updateUser() causes auth/user-token-expired 【发布时间】:2019-06-28 12:59:51 【问题描述】:
    我已成功通过电话号码进行身份验证。 (我可以查看firebase.auth.currentUser 是否已登录。) 然后我调用具有 admin.auth().updateUser(uid, somevalues) 的 firebase 管理员路由来设置用户 displayName 和电子邮件。 此步骤完成后,我的用户数据更改了 displayName 和电子邮件。(在 firebase 控制台中检查) 在我的身份验证中,我运行 firebase.auth().currentUser.reload() 以获取更新的用户数据,但突然出现错误 auth/user-token-expired 我只有在使用 admin.auth().updateUser(....) 后才检查过我的令牌丢失了。如果我不运行此命令,那么我可以毫无问题地执行 firebase.auth().currentUser.reload()。

更新:仅当我在调用 admin.auth().updateUser(....) 时设置了电子邮件,我的应用程序内的令牌才会失效。如果我只更改 displayName 令牌仍然有效。

【问题讨论】:

您的 Firebase 帐户中是否还启用了电子邮件身份验证?如果是这样,将令牌失效作为安全预防措施是有意义的。 哦。所以我不能同时进行电话身份验证和电子邮件身份验证? 不,实际上您可以同时拥有两者(Firebase 实际上建议这样做)。但是,如果您的帐户设置为允许用户使用电子邮件进行身份验证,那么无论您是否知道,我都认为令牌依赖于该凭证。因此,更改凭据(电子邮件地址)将使令牌无效。否则,更容易窃取其他用户的令牌和会话。 @misterfancypants 我应该怎么做才能没有这个错误并且仍然能够更改电子邮件? 我了解,但我从未见过更改电子邮件后必须重新授权的应用程序或网站。它只是一个糟糕的用户体验。我所做的是从云功能中提取电子邮件更新并从客户端身份验证中执行它。所以我更新了邮箱,没有重新授权。 【参考方案1】:

我不确定这里的确切问题是什么,但reload() 将使用刷新令牌,但是,刷新令牌会在 “检测到用户的重大帐户更改时过期。这包括密码等事件或电子邮件地址更新。”

见:https://firebase.google.com/docs/auth/admin/manage-sessions

所以当您的刷新令牌过期时(由于“重大帐户更改”),您需要重新授权..

【讨论】:

那么什么是更改电子邮件的正确方法并且没有此错误? 另外,如果我关闭电子邮件授权,此错误仍然存​​在 @rendom 这不是错误。该电子邮件被视为重大帐户更改,因此,根据设计,您需要重新授权该帐户

以上是关于firebase:admin.auth().updateUser() 导致 auth/user-token-expired的主要内容,如果未能解决你的问题,请参考以下文章

Firebase - TypeError:admin.auth(...)。createUserWithEmailAndPassword不是函数

“调用者没有权限”尝试使用 Firebase Admin SDK 创建自定义令牌

在Firebase安全规则中是否可以验证用户的身份验证令牌?

Firebase 云函数 - createCustomToken

将firebase oobCode解码为服务器端的用户

在 Laravel 5 中找不到类“App\Http\Controllers\admin\Auth”