【问题标题】:How to get the current UserId from Firestore?如何从 Firestore 获取当前的 UserId?
【发布时间】:2021-10-22 18:51:23
【问题描述】:

我有一个集合users,每个用户都有自己的文档。现在我想创建一个子集合来存储与特定用户相关的更多数据。

这是目前为止的代码:

class DatabaseService {

  Future isUserRegistered(String uid) async{
    return await FirebaseFirestore.instance.collection('users')
        .where('uid', isEqualTo: uid)
        .get();
  }

  Future registerNewUser(email, password, uid) async{
    return await FirebaseFirestore.instance.collection('users')
        .doc(uid).set(
      {
        "email": email,
        "password": password,
        "uid": uid,
        "token": -1,
        "userGoal": false,
        "userGender": false,
      },
    );
  }

我创建了一个保存函数,但不是将数据存储在具有当前 uid 的文档中的子集合中,而是创建了一个名为“uid”的新文档。如何解决?

  Future saveInSubcollectionToRemote() async{
    Map<String, dynamic> data = UserManager.userWeights;
    return await FirebaseFirestore.instance.collection('users')
        .doc('uid')
        .collection('weights')
        .doc(data['userWeight'])
        .set(data);
  }

class UserManager {
  static Map<String, dynamic> userWeights = {'weights': []};
}

编辑 这是我的 google 身份验证,在这里我得到一个 id,但我想要的是 uid 而不是这个 id

  ///Authentication

  void signInGoogle(context) {
    DatabaseService handler = new DatabaseService();
    _googleSignIn
        .signIn()
        .then((userdata) => {
              print(userdata.toString()),
              handler
                  .isUserRegistered(userdata.id.toString())
                  .then((value) => {
                        if (value.docs.length == 0)
                          {
                            print("Not registered"),
                            registerUserToApp(
                                context, userdata.email.toString(), "password", userdata.id.toString())
                          }
                        else
                          {
                            print(value.docs[0].data().toString()),
                            UserManager.userdata = value.docs[0].data(),
                            Navigator.pushAndRemoveUntil(
                              context,
                              MaterialPageRoute(
                                builder: (context) {
                                  return NavBar();
                                },
                              ),
                              (route) => false,
                            ),
                          }
                      })
                  .catchError((e) => {
                        showAlertDialog(
                            context, "Error", ""),
                      })
            })
        .catchError(
            (e) => {showAlertDialog(context, "Error", "")});
  }

  void registerUserToApp(context, email, password, uid) {
    DatabaseService handler = new DatabaseService();
    try {
      handler.registerNewUser(email, password, uid).then((value) => {
            showAlertDialog(context, "Congratulations!",
                "You registered to the app"),
          });
    } catch (error) {
      print(error.toString());
      showAlertDialog(context, "Error", "");
    }
  }
}

【问题讨论】:

  • 听起来您实际上没有用户的 UID。如果你这样做了,你只需把它放在字符串 'uid' 的位置。 Firestore 不会为您管理 UID - 您可以从其他地方获取它们,例如 Firebase 身份验证。
  • 我是用google登录的,是不是和其他认证方式类似?以及如何获取uid?抱歉,我是 Firestore 的新手
  • 底线是,无论您的用户标识符是什么,您都必须向 Firestore 提供数据。 Firestore 不知道,也无法知道。它没有“用户”。它只是一个数据库,您必须提供要存储的值。如果您使用 Firebase 身份验证,则可以在安全规则中为用户分配权限,仅此而已。

标签: flutter dart google-cloud-firestore


【解决方案1】:

使用doc('uid') 将您的文档ID 设置为'uid'。这就是导致您的问题的原因。

试试这个:

  Future saveInSubcollectionToRemote(String uid) async{
    Map<String, dynamic> data = UserManager.userWeights;
    return await FirebaseFirestore.instance.collection('users')
        .doc(uid)
        .collection('weights')
        .doc(data['userWeight'])
        .set(data);
  }

像在registerNewUser() 中一样传递uid

【讨论】:

    【解决方案2】:

    代码中的uid 通常是用户的唯一标识。 Firestore 本身不知道这样的uid。相反,uid 来自您使用的身份提供者。

    您可以使用 Google Sign-in 中的用户 ID 在 Firestore 中识别用户,但更常见的是使用 Firebase 登录。

    登录 Google 后,您可以使用这些凭据通过调用 signInWithCredential 登录 Firebase 身份验证,如social authentication 上的文档所示。

    一旦您成为 signed in to Firebase Authentication,您将从 Firebase 身份验证中获得一个 UID,然后您可以使用它来识别 Firestore(以及后来的 secure access to those documents)中的用户文档。

    完成此操作后,您可以通过FirebaseAuth.instance.currentUser(一次)或FirebaseAuth.instance.currentUser()(连续)获取当前用户(以及他们的 UID),然后在 Firestore 调用中再次使用它。

    【讨论】:

    • 谢谢!我已将我使用谷歌登录的代码添加到我的问题中。如何在我的代码中实现signInWithCredential来获取uid?
    • 如前所述,您可以在用户登录后使用FirebaseAuth.instance.currentUser 获取用户,或者使用FirebaseAuth.instance.currentUser() 连续收听。从您在这两种情况下获得的User object,您可以从其uid 属性中获取UID。我强烈建议在编码时将我链接的文档放在手边,因为我发现它是迄今为止回答此类问题的最快方法。
    猜你喜欢
    • 2022-01-16
    • 1970-01-01
    • 2020-02-21
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 2016-06-05
    相关资源
    最近更新 更多