基于 firebase 身份验证在 firestore 中创建相同的用户

Create identical user in firestore based on firebase authentication

所以我目前正在开发一个项目,在该项目中我已经使用 Firebase 和 Google 作为唯一的 sign-in/up 提供商实施了身份验证。身份验证过程工作正常,但是我想向经过身份验证的用户添加更多和高度特定的属性并能够操纵这些属性。为此,我打算使用 Google Firestore。

现在的问题是,如何将创建的用户帐户从 firebase auth 镜像到 firestore。我考虑过只要调用 signIn 函数就根据 UID 将它写入 firestore,但是问题是我认为同一用户会有多个条目。

我在一些博客上读到,使用云功能可以实现预期的结果,但是我正在寻找可以在下一个项目中实施的解决方案,即使我可能会切换到云稍后运行。

你知道我怎样才能达到预期的结果吗? 感谢您的帮助,非常感谢!

没有必要,因为这两个服务会采用相同的用户身份 = UID。
Cloud Functions 提供 Firebase Authentication Triggers,它提供 event.uid.
根据事件和 UID,您可以使用 Firebase/Firestore admin 添加或删除节点。

您在回答中描述的方法(即“将创建的用户帐户从 Firebase 身份验证镜像到 Firestore”)确实是标准方法。

您提到了以下风险:

There will be more than one entry for the same user I reckon

如果问题是“如何处理不同用户拥有相同用户文档 ID 的风险”,如果您使用身份验证服务生成的用户 ID (uid) 作为文档 ID,您可以确保它是唯一的。

如果问题是“如何为一个用户创建多个用户的文档,包含不同的信息”,您可以很好地使用不同的集合,并再次使用身份验证生成的用户 ID (uid)服务作为文档 ID(每个文档在不同的集合中)。


您基本上有两个选项来创建 Firestore 用户的文档:

通过云函数:在这种情况下,您将trigger the Cloud Function on user's creation并使用用户的 uid 创建 Firestore 文档。

 exports.createUserDoc = functions.auth.user().onCreate((user) => {
  const userId = user.uid;
  return admin.firestore().collection('users').doc(userId).set( {...} );
});

来自 front-end:您需要设置一个安全规则,仅当文档 ID 相同时才允许用户创建自己的 Firestore 用户文档到他的用户名。这是一个例子:

service cloud.firestore {
  match /databases/{database}/documents {
    // Make sure the uid of the requesting user matches the ID of the user
    // document. The wildcard expression {userId} makes the userId variable
    // available in rules.
    match /users/{userId} {
      allow create: if request.auth != null && request.auth.uid == userId;
    }
  }
}