FirebaseUI - 在创建用户之前验证 displayName
Posted
技术标签:
【中文标题】FirebaseUI - 在创建用户之前验证 displayName【英文标题】:FirebaseUI - Validate displayName before user creation 【发布时间】:2020-01-31 13:43:01 【问题描述】:我正在使用firebaseui-web-react
。在注册流程中,我想在创建用户之前验证用户提供的displayName
。特别是,我想确保 displayName
是唯一的。
我知道如何使用 Firestore 验证唯一用户名。我有一个带有 displayName
字段的公共 user
集合。我知道如何查看 displayName
是否已被占用,查询如下:
const snapshot = await store
.collection('user')
.where('displayName', '==', displayNameFormValue)
.get()
return snapshot.empty
我想在创建用户之前验证displayName
。我想避免创建并立即删除用户。我想在 FirebaseUI 发送创建用户的请求之前验证 displayName
。
但是,FirebaseUI 仅提供像 signInSuccessWithAuthResult
这样的回调。这些回调仅在创建用户后运行。如果我使用这些回调来验证displayName
,如果他们的displayName
被占用,我将不得不追溯删除创建的用户。我想在创建用户之前验证用户的displayName
以避免删除。
如何在创建 Firebase 用户之前使用上面显示的查询来验证 displayName
?如何在利用预制 FirebaseUI 组件和上下文的同时支持唯一的显示名称?如何将表单验证与 FirebaseUI 集成?
【问题讨论】:
【参考方案1】:正如documentation中所说:
目前,FirebaseUI 不提供开箱即用的自定义功能。但是,小部件周围的 html 不受它的影响,因此您可以在小部件容器周围显示您想要的所有内容。
因此您无法添加预挂钩、验证等。但是,您可以尝试使用xhr-intercept 或fetch-intercept 拦截请求,并在有创建用户的请求时做任何您想做的事情.如果displayName
不是唯一的可以取消请求并通过JS显示错误。
【讨论】:
【参考方案2】:由于 firebaseUI 无法自定义,可能的解决方案可以。
后端解决方案 - 订阅通知任何数据更改的 firebase hooks。您可以在其中检查唯一的 displayName。
前端解决方案 - 设计与 firebase UI plugins 集成的自定义身份验证 UI 屏幕。在这里,您将在将数据发送到 Firebase 之前完全控制数据。
【讨论】:
我不知道如何使用挂钩来避免删除无效用户,并且您提供的链接不会为我加载。你能解释一下后端策略吗? 更新了错误链接。这可能会对您有所帮助 - firebase.google.com/docs/reference/functions/… 在创建用户记录后不会触发 onWrite,因此需要我追溯删除它? 看来你需要删除它。我没有太多使用firebase云功能的经验,我只是和你一起探索它。检查这样的编写规则是否有帮助 - firebase.google.com/docs/firestore/security/get-started 不幸的是,我相信使用 Firebase Auth 创建的 Firebase 用户不会存储在 Firestore 集合中。正如我在示例代码中引用的那样,您必须创建自己的“用户”集合。据我了解,Firebase 用户本身不能受到安全规则的限制。因此,我担心没有 teimurjan 所说的免删除“后端解决方案”。以上是关于FirebaseUI - 在创建用户之前验证 displayName的主要内容,如果未能解决你的问题,请参考以下文章
FirebaseUI for Web — 身份验证 — 如何重新进行身份验证?