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

如何在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,同时需符合隐私合规要求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 07:54:54