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

