Firebase用户长时间登录后修改密码请求setAccountInfo返回400错误如何解决
问题根因
你可以先在现有代码的error回调中打印error.code,大概率返回值为auth/requires-recent-login。Firebase Auth 要求修改密码、删除账号这类敏感操作必须基于用户近期的登录凭证,用户登录后长时间未操作,当前用户的登录态新鲜度不满足敏感操作校验,就会触发该400错误。
修复方案
核心逻辑是先捕获需要重新认证的错误,触发用户重新验证身份后再执行修改密码操作,参考改造后的代码如下:
const password = changePasswordFrom.value.password; // 若使用firebase web v9+版本,按如下引入对应方法;旧版本请对应调整API写法 import { EmailAuthProvider, reauthenticateWithCredential } from "firebase/auth"; this._firebaseAuth.currentUser.then(async user => { if (!user) return; try { await user.updatePassword(password); // 原有修改密码成功的业务逻辑 // some code } catch (error) { // 判断是否为需要近期登录的校验错误 if (error.code === 'auth/requires-recent-login') { try { // 此处替换为你的业务UI弹窗,让用户输入当前登录的密码完成身份校验 const currentPassword = prompt('请输入当前登录密码以完成身份验证'); // 若使用手机号/第三方登录方式,请对应替换AuthProvider的凭证生成逻辑 const credential = EmailAuthProvider.credential( user.email, currentPassword ); // 执行重新认证 await reauthenticateWithCredential(user, credential); // 重新认证成功后再次调用修改密码接口 await user.updatePassword(password); // 原有修改密码成功的业务逻辑 // some code } catch (reauthError) { // 重新认证失败的错误处理,比如密码输入错误、用户取消操作等 // error } } else { // 其他类型错误的原有处理逻辑 // error } } });
补充说明
- 若你的业务使用手机号、谷歌/微信等第三方登录方式,不需要要求用户输入密码,只需要替换
EmailAuthProvider为对应登录方式的Provider,生成合法凭证后执行重新认证即可 - 禁止硬编码用户当前密码,必须通过交互让用户主动输入验证信息,符合安全规范
内容的提问来源于stack exchange,提问作者Atanas Ivanov
相关产品推荐
相关产品推荐

