使用户 UID [身份验证] 与用户 - firestore 数据库相同

Jua*_*sas 1 dart firebase flutter google-cloud-firestore

我需要使用户 UID 与文档 id 相同。

前任:

在[身份验证]中,我的用户具有以下信息:电子邮件:jcasasmail@gmail.com UID:U8EZAjrCWQRvll6CVmI6OpGZwcH3

在[Firestore数据库]中,我有一个用户集合。在用户集合中,我为每个用户都有一个文档。

我希望文档 ID 与用户 ID 相同。

这可能吗?

以下是我在 [Authentication] 和 [Firestore database] 用户集合中创建用户的片段::

class FirebaseAuthProvider implements AuthProvider {
  @override
  Future<void> initialize() async {
    await Firebase.initializeApp(
      options: DefaultFirebaseOptions.currentPlatform,
    );
  }
  @override
  Future<AuthUser> createUser({
    required String email,
    required String password,
  }) async {
    try {
      await FirebaseAuth.instance.createUserWithEmailAndPassword(
        email: email,
        password: password,
      );
      final user = currentUser;
      if (user != null) {
        return user;
      } else {
        throw UserNotLoggedInAuthException();
      }
    } on FirebaseAuthException catch (e) {
      if (e.code == 'weak-password') {
        throw WeakPasswordAuthException();
      } else if (e.code == 'email-already-in-use') {
        throw EmailAlreadyInUseAuthException();
      } else if (e.code == 'invalid-email') {
        throw InvalidEmailAuthException();
      } else {
        throw GenericAuthException();
      }
    } catch (_) {
      throw GenericAuthException();
    }
  }  
}

Run Code Online (Sandbox Code Playgroud)

下面是我的 FirebaseCloudStorage 类

class FirebaseCloudStorage {
  final user = FirebaseFirestore.instance.collection('user');
  Future<CloudUser> createNewUser({
    required String userId,
    required String userState,
    required String userImage,
    required String userFirstName,
    required String userLastName,
    required String userCellNumber,
    required String userCity,
    required String userAreaCode,
    required String userAddress,
    required String userEmail,
  }) async {
    final document = await user.add({
      
      userIdColumn: userId,
      userStateColumn: userState,
      userImageColumn: userImage,
      userFirstNameColumn: userFirstName,
      userLastNameColumn: userLastName,
      userCellNumberColumn: userCellNumber,
      userCityColumn: userCity,
      userAreaCodeColumn: userAreaCode,
      userAddressColumn: userAddress,
      userEmailColumn: userEmail,
    });
    final fetchedUser = await document.get();
    return CloudUser(
      documentId: fetchedUser.id,
      userId: userId,
      userState: userState,
      userImage: userImage,
      userFirstName: userFirstName,
      userLastName: userLastName,
      userCellNumber: userCellNumber,
      userCity: userCity,
      userAreaCode: userAreaCode,
      userAddress: userAddress,
      userEmail: userEmail,
    );
  }

// singleton
  static final FirebaseCloudStorage _shared =
      FirebaseCloudStorage._sharedInstance();
  FirebaseCloudStorage._sharedInstance();
  factory FirebaseCloudStorage() => _shared;
}
Run Code Online (Sandbox Code Playgroud)

下面是启动所有创建的注册屏幕按钮


  Future createUserAccount() async {
    if (_photo == null) return;
    try {
      setState(() {
        _isLoading = true;
      });
      await AuthService.firebase().createUser(
        email: _email.text,
        password: _password.text,
        // displayName: _userFirstName.text,   // not working
      );
 
      final userId = AuthService.firebase().currentUser?.id;
      final destination = 'user-profile-image/$userId';
      final ref = FirebaseStorage.instance.ref(destination);
      await ref.putFile(_photo!);
      imageUrl = await ref.getDownloadURL();
      _userService.createNewUser(
        userId: userId as String,
        userState: 'new',
        userImage: imageUrl as String,
        userFirstName: _userFirstName.text,
        userLastName: _userLastName.text,
        userCellNumber: _userCellphoneNumber.text,
        userCity: _userCity.text,
        userAreaCode: _userAreaCode.text,
        userAddress: _userAddress.text,
        userEmail: _email.text,
      );

      setState(() {
        _isLoading = false;
      });
      AuthService.firebase().sendEmailVerification();
      Navigator.of(context).pushNamed(verifyEmailRoute);
    } on WeakPasswordAuthException {
      await showErrorDialog(
        context,
        'Weak password',
      );
    } on EmailAlreadyInUseAuthException {
      await showErrorDialog(
        context,
        'Email is already in use',
      );
    } on InvalidEmailAuthException {
      await showErrorDialog(
        context,
        'This is an invalid email address',
      );
    } on GenericAuthException {
      await showErrorDialog(
        context,
        'Failed to register',
      );
    }
  }

Run Code Online (Sandbox Code Playgroud)

Pet*_*tai 5

set您可以通过使用而不是add指定已经存在的用户标识符来为文档使用自定义 ID 。所以在你的createNewUser函数中你可以这样做:

final document = await user.doc(userId).set({      
  userIdColumn: userId,
  userStateColumn: userState,
  userImageColumn: userImage,
  userFirstNameColumn: userFirstName,
  userLastNameColumn: userLastName,
  userCellNumberColumn: userCellNumber,
  userCityColumn: userCity,
  userAreaCodeColumn: userAreaCode,
  userAddressColumn: userAddress,
  userEmailColumn: userEmail,
});
Run Code Online (Sandbox Code Playgroud)

注意:从服务器端的受信任环境而不是从客户端维护您自己的用户集合可能是更好的解决方案。例如,您可以使用 Firebase 身份验证触发器在发生更改(例如注册新用户)时添加/删除/修改用户数据。这样您就不必允许从客户端对您的用户集合进行写入操作。