如何在Firebase中阻止单设备创建多个账号并校验Firestore数据?
解决同一设备重复注册账号的Firestore校验方案
要阻止同一设备创建多个账号,核心是在用户注册前先校验当前设备ID是否已在Firestore中存在对应的用户记录,而非先创建Auth账号再处理。调整后的实现逻辑如下:
步骤1:调整流程顺序,先校验再注册
修改你的storeUserData方法,先查询Firestore中是否有当前设备ID的用户记录,确认未注册后再执行账号创建流程:
private void storeUserData(String name, String email, String password) { // 获取当前设备ID String Deviceid = Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID); // 先执行Firestore查询,校验设备是否已注册 firestore.collection("Users") .whereEqualTo("Deviceid", Deviceid) .get() .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() { @Override public void onComplete(@NonNull Task<QuerySnapshot> task) { if (task.isSuccessful()) { // 查询到结果,说明设备已注册过账号 if (!task.getResult().isEmpty()) { progressDialog.dismiss(); Toast.makeText(SignupActivity.this, "该设备已注册账号,无法重复创建", Toast.LENGTH_SHORT).show(); return; } // 设备未注册,继续创建Auth账号 auth.createUserWithEmailAndPassword(email, password) .addOnCompleteListener(new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { progressDialog.dismiss(); String referCode = email.substring(0, email.lastIndexOf("@")); UserModel model = new UserModel(name, email, password, "https://firebasestorage.googleapis.com/v0/b/cashapp-278ce.appspot.com/o/plac.png?alt=media&token=61f99d71-5ada-47f0-b72a-9b69e4e32471", referCode, Deviceid, "false", 5, 5, 5); String id = task.getResult().getUser().getUid(); firestore.collection("Users").document(id).set(model) .addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { if (task.isSuccessful()) { Intent intent = new Intent(SignupActivity.this, MainActivity.class); startActivity(intent); finish(); } else { Toast.makeText(SignupActivity.this, "用户数据存储失败:" + task.getException().getMessage(), Toast.LENGTH_SHORT).show(); } } }); } else { progressDialog.dismiss(); Toast.makeText(SignupActivity.this, "账号创建失败:" + task.getException().getMessage(), Toast.LENGTH_SHORT).show(); } } }); } else { progressDialog.dismiss(); Toast.makeText(SignupActivity.this, "设备校验失败:" + task.getException().getMessage(), Toast.LENGTH_SHORT).show(); } } }); }
关键注意事项
- 确保
UserModel中的Deviceid字段名和查询时的"Deviceid"完全一致(Firestore字段名区分大小写) - 用户量较大时,建议给
Users集合的Deviceid字段创建单字段索引,Firestore控制台会自动提示创建缺失的索引 Android_ID可能因刷机、恢复出厂设置等操作变化,若需更稳定的设备标识,可选择:- 生成自定义UUID并存储在
SharedPreferences(卸载重装会重置) - 使用IMEI(需
READ_PHONE_STATE权限,Android 10+限制获取) - 结合多种标识生成唯一ID,同时需符合隐私合规要求
- 生成自定义UUID并存储在
内容的提问来源于stack exchange,提问作者Jakub Olszewski
相关产品推荐
相关产品推荐

