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

Firebase Realtime Database UID与Authentication UID不一致问题排查

问题根因
  • UID获取时机错误:你在点击注册按钮、尚未执行新用户注册逻辑时,就调用FirebaseAuth.getInstance().getCurrentUser()取UID,此时拿到的是注册前已登录的旧账号(比如之前的匿名用户、未注销的历史登录账号)的UID,并非本次新注册账号的UID。
  • createUserWithEmailAndPassword方法执行成功后,Firebase Auth会生成全新的UID作为新注册用户的唯一标识,同时自动切换当前登录账号为新注册用户,你提前拿到的旧UID和新生成的Auth UID自然不匹配。
修复方案
  1. 删掉注册按钮点击事件中提前获取UID的相关代码,注册成功后再取新用户的UID即可
  2. 注册成功后从返回的任务结果中获取新用户UID,再写入Realtime Database

修正后的核心代码示例:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_new_user);

    email = findViewById(R.id.email_create);
    password = findViewById(R.id.password_create);
    con_password = findViewById(R.id.password_confirm);
    auth = FirebaseAuth.getInstance();
    registerBtn = findViewById(R.id.Register);

    registerBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String txt_email = email.getText().toString();
            String txt_password = password.getText().toString();
            String txt_con_password = con_password.getText().toString();

            // 移除提前获取UID的冗余代码

            if (txt_email.isEmpty() || txt_password.isEmpty()) {
                Toast.makeText(New_User.this, "请填写所有字段", Toast.LENGTH_SHORT).show();
            } else if (!txt_password.equals(txt_con_password)){
                Toast.makeText(New_User.this, "两次输入密码不一致", Toast.LENGTH_SHORT).show();
            } else {
                registerUser(txt_email, txt_password);
            }
        }
    });
}

private void registerUser(String email, String password) {
    auth.createUserWithEmailAndPassword(email, password).addOnCompleteListener(New_User.this, new OnCompleteListener<AuthResult>() {
        @Override
        public void onComplete(@NonNull Task<AuthResult> task) {
            if (task.isSuccessful()) {
                // 注册成功后再获取新用户的UID
                FirebaseUser newUser = task.getResult().getUser();
                String newUid = newUser.getUid();
                // 写入数据库
                databaseReference.child("User ID").child(newUid).child("email").setValue(email);
                // 注意:不要存储明文密码,此处删除密码存储逻辑
                Toast.makeText(New_User.this, "用户注册成功", Toast.LENGTH_SHORT).show();
                Intent intent = new Intent(New_User.this, PhysicalParameters.class);
                startActivity(intent);
                finish();
            }else {
                Toast.makeText(New_User.this, "注册失败: " + task.getException(), Toast.LENGTH_SHORT).show();
            }
        }
    });
}

安全提示:不要将用户明文密码存储在Realtime Database中,Firebase Auth已经安全托管了用户的登录凭证,明文存储密码会导致严重的信息泄露风险

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 18:15:03