注册用户未显示在 Firebase Firestore 中

Posted

技术标签:

【中文标题】注册用户未显示在 Firebase Firestore 中【英文标题】:Registered user not showing in firebase firestore 【发布时间】:2021-07-23 00:10:24 【问题描述】:

简而言之,我希望通过电子邮件和密码在 firebase firestore 中通过身份验证的用户, 成功注册后,我的用户只出现在 authentication 面板中。 我目前正在使用使用 firebase_auth: ^1.1.1 包的 Flutter 应用程序。 所以我希望之后

UserCredential userCredential = await FirebaseAuth.instance.createUserWithEmailAndPassword(
    email: "abc@example.com",
    password: "SuperSecretPassword!"
  );

从 firebase_auth 包调用的函数是 createUserWithEmailAndPassword 我想要 Firebase 数据库中的这个注册用户。

【问题讨论】:

【参考方案1】:

Firebase 身份验证用于注册用户,而 Firestore 用于存储数据。如果您还想将用户添加到 Firestore,则需要将 cloud_firestore 插件添加到您的 pubspec.yaml 文件中:

dependencies:
  flutter:
    sdk: flutter
  cloud_firestore: ^1.0.7

那么你可以这样做:

final firestoreInstance = FirebaseFirestore.instance;
var firebaseUser =  FirebaseAuth.instance.currentUser;

firestoreInstance.collection("users").doc(firebaseUser.uid).set(
  
    "email" : "abc@example.com",
  ).then((_)
    print("success!");
  );

这将创建一个名为 users 的集合,其文档 ID 等于经过身份验证的用户 ID,在其中您将拥有用户的电子邮件。

【讨论】:

【参考方案2】:

.createUserWithEmailAndPassword 在 auth 中创建一个用户,如果你检查你的 auth 选项卡,你应该会看到创建的用户。 它不会在 firestore 中创建用户 为此,您必须自己实现。

下面是一个示例

         final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;
          User user = (await _firebaseAuth.createUserWithEmailAndPassword(
                email: email, password: password))
            .user;
        //if create user succeeds
var user =UserModel( 
userID:user.uid,
email:user.email)
        FirebaseFirestore.instance
    //save user based on their id from auth
    
                    .doc("users/$user.uid")
                    .set(user.toJson());

编辑

您可以创建用户模型 示例:

class UserModel 
  final String userID;
  final String displayName;
  final String email, pushToken;
  final String phoneNumber;
  final String profilePictureURL, dateJoined;

  UserModel(
   
    this.dateJoined,
    this.userID,
 
    this.email,
   
  );

  Map<String, Object> toJson() 
    return 
      
     
      'userID': userID,
      
      'email': email == null ? '' : email,
      
      'appIdentifier': 'my app',
      'dateJoined': DateTime.now(),
    ;
  

....

查看json的使用方法

【讨论】:

toJson()从何而来【参考方案3】:

除了griffins answer,您还可以使用cloud function 来响应用户创建事件(trigger onCreated)。然后,您可以异步创建用户集合,而不会重载 Flutter 客户端。例如,带有createUserInFirestore 函数的index.ts

import * as functions from "firebase-functions";
import * as admin from "firebase-admin";

admin.initializeApp();
const db = admin.firestore();

export const createUserInFirestore = functions.auth.user().onCreate(
    async (user) => 
        return db.collection('users').doc(user.uid).set(
            "email" : user.email,
            "name" : user.displayName,
        );
    
);

【讨论】:

以上是关于注册用户未显示在 Firebase Firestore 中的主要内容,如果未能解决你的问题,请参考以下文章

为啥注册用户未在 Firebase 中进行身份验证?为啥用户不能将产品添加到数据库 Firebase?

Firebase 注册令牌未显示在 Android Studio logcat 中

收到 Firebase 注册令牌但未显示通知

Firebase - Auth - 发现已注册但未验证电子邮件的用户

.observe firebase 方法 swift4 后代码未执行

如果链接未注册,Firebase 动态链接默认行为