如何在用户注册过程中使用firebase身份验证保存额外信息

kxxlusnw  于 2022-11-30  发布在  其他
关注(0)|答案(4)|浏览(154)

我正在建立一个网站,我已经集成了firebase authentication登录/注册的网站用户。
用户可以通过电子邮件密码或移动OTP方法登录/注册。我使用的是官方的firebase js Auth UI Widget:firebaseui-web进行验证。
在注册时,我还想获取其他用户的详细信息,如全名、性别、年龄等。
我在网上找到了两种方法:
1.成功注册后在firestore中存储额外信息。
这种方法的问题是我想成为一个原子事务。意味着,要么所有额外的信息应该在注册过程中存储注册过程不应该成功。我不知道如何实现这个流程,甚至是可能的。
1.使用JSON. stringify/JSON. parse方法在firebase auth object字段中存储额外的信息,如displayName、photoURL。我正在使用他们的auth UI小部件,不知道如何在电子邮件或移动OTP注册过程中嵌入此信息。
那么,如何在注册过程中保存用户的额外信息?任何不同的方法可能?
网站托管在firebase主机上。网站使用firestore来存储用户的任何额外数据,因为firebase auth不提供此功能。我还实现了firebase云函数(Typescript,node.js)来进行一些基本的CRUD操作。所以简单地说,一个完整的firebase环境。

ee7vknir

ee7vknir1#

这是每个firebase用户都要面对的问题,一般是怎么解决的?就像其他用户指出的,就是在Firestore中增加额外的用户信息,你能保证原子性吗?不,你不能,auth和db是两个不同的系统,您可以将用户添加到auth,并在回调中发现您无法将用户添加到db,因为您没有Internet连接。人们会怎么做?通常都是这样。
如果你的应用程序必须保证原子性,那么你可以在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

whlutmcx

whlutmcx2#

您想要捕获的附加信息实际上通常会存储在附加数据库中,如Cloud Firestore或Realtime Database。自定义声明通常保留用于与访问控制相关的信息,如组成员身份和用户是否为管理员。
除了注册所需的最少信息(例如,使用电子邮件+密码身份验证时的电子邮件地址和密码)之外,没有原子方法可以在注册过程中添加其他信息。如果原子性是您的用例的要求,您可能希望超越Firebase。

c0vxltue

c0vxltue3#

既然你想保存用户的数据。我假设你保存数据是为了以后能对它做一些操作。因此建议你把你的数据保存在云Firestore中。云Firestore的查询将帮助你在将来能够操纵任何你可能想对数据进行的CRUD操作。
存储数据的一个好方法是在使用firebase auth注册用户之后。您可以在oncomplete侦听器中获取firebase auth返回的userID,然后在USERS集合中使用make一个文档,其键为userID,然后在该文档中保存有关用户的额外信息。

qc6wkl3g

qc6wkl3g4#

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

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

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

applicationName->usersNode->userId->data

检查数据是否成功存储,继续下一个活动或主页,否则从授权中删除用户并要求他重试。

相关问题