You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase应用技术求助:实现密码验证通过后才可修改DisplayName

解决Firebase已登录用户修改名称时密码验证无效的问题

嘿,我一眼就看出问题所在啦——你现在的代码里,不管密码验证成功与否,用户名称都会被修改!这是因为你把更新名称的逻辑直接放在了onComplete方法的外层,没有和密码验证的结果绑定起来。

问题根源

当前代码中,user.updateProfile(profileUpdate)是在onComplete方法里直接执行的,不管task.isSuccessful()返回true还是false,这段更新名称的代码都会跑。所以哪怕弹出了“输入密码错误”的Toast,名称还是被改掉了。

修正后的代码

/** * Update Name Only */
private void updateDisplayNameOnly(){
    showProgress();
    AuthCredential credential = EmailAuthProvider
            .getCredential(FirebaseAuth.getInstance().getCurrentUser().getEmail(), mConfirm.getText().toString());
    FirebaseAuth.getInstance().getCurrentUser().reauthenticate(credential)
            .addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if (task.isSuccessful()) {
                        // 只有密码验证成功,才执行更新名称操作
                        FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
                        UserProfileChangeRequest profileUpdate = new UserProfileChangeRequest.Builder()
                                .setDisplayName(mName.getText().toString())
                                //.setPhotoUri(Uri.parse("https://avatarfiles.alphacoders.com/862/86285.jpg"))
                                .build();
                        user.updateProfile(profileUpdate)
                                .addOnCompleteListener(new OnCompleteListener<Void>() {
                                    @Override
                                    public void onComplete(@NonNull Task<Void> task) {
                                        hideProgress();
                                        if (task.isSuccessful()) {
                                            Log.d(TAG, "onComplete: User Profile updated");
                                            Toast.makeText(getActivity(), "名称更新成功", Toast.LENGTH_SHORT).show();
                                            // 这里可以处理重启APP或者刷新UI的逻辑
                                        } else {
                                            Toast.makeText(getActivity(), "名称更新失败", Toast.LENGTH_SHORT).show();
                                        }
                                    }
                                });
                    } else {
                        hideProgress();
                        // 密码验证失败,提示用户
                        Toast.makeText(getActivity(), "输入密码错误", Toast.LENGTH_SHORT).show();
                    }
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    hideProgress();
                    Toast.makeText(getActivity(), "验证失败:" + e.getMessage(), Toast.LENGTH_SHORT).show();
                }
            });
}

关键修正点

  • 核心逻辑绑定:把更新用户名称的代码移到if (task.isSuccessful())的分支内部,确保只有密码验证通过后才会执行名称更新
  • 优化提示信息:把验证失败的Toast改成更明确的“输入密码错误”,同时给updateProfile也添加了监听,能单独处理名称更新本身的成功/失败情况
  • 完善流程闭环:确保hideProgress()在所有分支都能执行,避免加载框一直停留在界面上

内容的提问来源于stack exchange,提问作者user7838657

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:47:00