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 — 身份验证 — 如何重新进行身份验证?

我可以更改用户注册时 FirebaseUI 要求的信息吗?

FirebaseUI 身份验证在 android 上崩溃

FirebaseUI,指定在特定情况下要打开的特定活动(注册后)

将用户添加到 Firebase 数据库

Facebook 的 FirebaseUI 身份验证不起作用