firebase 注册时检查Firestore中是否存在字符串值

9nvpjoqh  于 2022-11-17  发布在  其他
关注(0)|答案(2)|浏览(84)

在我的应用程序中,用户可以使用Firebase的电子邮件身份验证来注册帐户,注册时的必填字段之一是电话号码,它作为字符串值存储在Firestore中:

final phoneField = TextFormField(
      controller: phoneController,
      keyboardType: TextInputType.phone,
      autofocus: false,
      autocorrect: false,
      textInputAction: TextInputAction.next,
      validator: (value) {
        RegExp regex = RegExp(r'(^(?:[00]+)?[0-9]{10,15}$)');
        if (value!.isEmpty) {
          return AppLocalizations.of(context)!.phoneValidationEmpty;
        }
        if (!regex.hasMatch(value)) {
          return ("Please Enter a Valid phone Number");
        }
      },
      onSaved: (value) {
        phoneController.text = value!;
      },
      textAlign: TextAlign.center,
      decoration: InputDecoration(
        prefixIcon: Icon(Icons.phone),
        contentPadding: EdgeInsets.fromLTRB(20, 15, 20, 15),
        hintText: AppLocalizations.of(context)!.phoneNumber,
        border: OutlineInputBorder(
          borderRadius: BorderRadius.circular(10),
        ),
      ),
    );

我试图在“validator”中添加一个功能,它可以访问“Users”集合并检查所有文档(用户信息),特别是“phone”字段是否有任何重复。
我尝试使用查询快照,但它似乎没有正确使用它,我感谢任何帮助。

mm9b1k5b

mm9b1k5b1#

你有几个选择。
1.把手机存储在firebase的用户文档中,然后在那里寻找它们。这样做的问题是你必须给予所有用户权限来阅读所有其他用户的文档,看看手机是否存在......不好。
1.使用电话认证。如果你想确保只有一个电话号码存在于你的系统中,我建议设置电话认证,将电话号码存储在用户的认证令牌上。在整个应用程序中只使用该字段。你可能想设置一个自定义声明“PhoneVerified”t/f。
从长远来看,手机认证和社交认证(google,apple,facebook)会更好地进行身份验证。有firestore功能可以链接账户,所以你可以要求用户用任何方法登录,并提示他们也用另一种方法进行认证,以确保一致性。

f0brbegy

f0brbegy2#

Firebase最近推出了认证阻断触发器,你可以使用云功能,这是一个安全的环境,并在注册用户之前检查电话号码是否存在于firestore中。

NB//要使用阻止函数,您必须将Firebase项目升级到带有Identity Platform的Firebase身份验证。如果尚未升级,请先进行升级。

import { beforeUserCreated } from "firebase-functions/v2/identity";        
    
//runs before a user is created using firebase authentication
export const beforecreated = beforeUserCreated((event) => {
              // Check if phone number exists in firestore
            });

相关问题