如何使用Firebase身份验证在用户注册过程中保存其他信息

时间:2019-12-02 11:32:21

标签: html firebase authentication google-cloud-firestore firebase-authentication

我正在建立一个集成了firebase authentication的网站,用于登录/注册网站用户。

用户可以通过电子邮件密码或移动OTP方法登录/注册。 我正在使用官方的Firebase JS Auth UI小部件:firebaseui-web进行此身份验证过程。

注册时,我还想捕获其他用户详细信息,例如全名,性别,年龄等。

我在网上发现了两种方法:

    成功注册后,
  1. 将更多信息存储在Firestore中。

    这种方法的问题是我想成为原子交易。意味着,所有额外信息都应该在注册过程期间存储,或者在注册过程中不成功。我不确定如何实现此流程,甚至根本不可能。

  2. 使用JSON.stringify / JSON.parse方法将额外的信息存储在firebase auth object字段中,例如在displayName,photoURL中。我正在使用他们的auth UI小部件,不确定在电子邮件或移动OTP注册过程中如何嵌入此信息。

那么,如何在注册过程中保存用户的额外信息? 也许有其他不同的方法吗?

网站托管在Firebase托管上。网站使用Firestore来存储用户的任何其他数据,因为firebase身份验证不提供此功能。我还为一些基本的CRUD操作实现了Firebase云功能(Typescript,node.js)。简而言之,一个完整的Firebase环境。

4 个答案:

答案 0 :(得分:1)

您实际上希望捕获的其他信息通常会存储在其他数据库中,例如Cloud Firestore或实时数据库。通常将自定义声明保留给与访问控制有关的信息,例如组成员身份以及用户是否为管理员。

除了注册所需的最少信息(即使用电子邮件+密码验证时的电子邮件地址和密码)之外,没有原子方法可以在注册期间添加其他信息。如果您的用例需要原子性,那么您可能不希望局限于Firebase。

答案 1 :(得分:1)

因为您要保存用户的数据。我假设您正在保存数据,以便以后可以对其进行一些操作。因此,建议您将数据保存在Cloud Firestore中。 Cloud Firestore的查询将在将来帮助您解决可能需要对数据进行的任何CRUD操作。

一种存储数据的好方法是在使用firebase auth注册用户之后。您可以在oncomplete侦听器中获取firebase auth返回的userID,然后在USERS集合内创建一个密钥为userID的文档,然后在该文档中保存有关该用户的其他信息。

答案 2 :(得分:1)

这是每个Firebase用户都必须处理的事情。一般如何解决?正如其他用户指出的那样,可以通过将其他用户信息添加到Firestore中来解决此问题。你能保证原子性吗?不,您不能,auth和db是两个不同的系统,您可以将用户添加到auth,并且在回调中发现您无法将用户添加到db,因为您没有互联网连接。人做什么?通常与它同住。

如果您的应用程序必须保证原子性,那么您可以加倍努力,并在firebase函数中实现身份验证。例如,这是两步登录的示例:

import { Request, Response } from "express";
import * as admin from 'firebase-admin'

export async function create(req: Request, res: Response) {
   try {
       const { displayName, password, email, role } = req.body

       if (!displayName || !password || !email || !role) {
           return res.status(400).send({ message: 'Missing fields' })
       }

       const { uid } = await admin.auth().createUser({
           displayName,
           password,
           email
       })
       await admin.auth().setCustomUserClaims(uid, { role })

       return res.status(201).send({ uid })
   } catch (err) {
       return handleError(res, err)
   }
}

function handleError(res: Response, err: any) {
   return res.status(500).send({ message: `${err.code} - ${err.message}` });
}

如果出现问题,您可以从auth添加用户删除。这样至少可以保证您的回滚代码将在Google服务器中执行。

此代码示例摘自https://www.toptal.com/firebase/role-based-firebase-authentication

答案 3 :(得分:0)

首次注册和onComplete方法检查注册是否成功。

     if (task.isSuccessful()) { 
   // String userId = task.getResult().getUser().getUid();
   //  get user unique id 
   // saveUserData()
    }

获取用户唯一ID,并将其用作密钥并存储数据,例如

applicationName->usersNode->userId->data

检查数据是否已成功存储,请继续进行下一个活动或“主页”,否则请从身份验证中删除用户,然后要求他重试。