【问题标题】:Workflow to create Firebase users from Cloud Function从 Cloud Function 创建 Firebase 用户的工作流程
【发布时间】:2022-01-13 20:22:01
【问题描述】:

我正在创建一个带有 Google Firebase 后端的 Angular 应用。我在“用户”和“俱乐部”之间存在多对多关系,如下所示:

User Club
First Name Name
Last Name Member Count
Phone no Collection of Documents with User Name, User Role and User's Membership Reference
Clubs[] -array of maps with Club Name, Club ID, User's Role and User's Membership Reference
Messages subcollection

用户文档使用数组,因为俱乐部的数量很少(最多 3-4,通常为 1),并且总是需要检索。俱乐部文档使用子集合,因为成员数量会很大,并不总是需要检索。

用户由俱乐部管理员创建。他们将不知道给定的电子邮件地址是否已经存在(因为他们已经在另一个俱乐部拥有帐户),或者他们是否是该应用程序的全新用户。

我有一个具有以下工作流程的云功能,通过新用户电子邮件开始:

  1. 检查请求是否具有正确的权限以添加用户
  2. 查看给定电子邮件是否存在用户
  3. 如果不存在用户,则使用该电子邮件创建用户
  4. 然后在任何一种情况下,向 auth 用户添加自定义声明,向 User 中的 Club 数组添加一个条目,并在 Club/members 集合中创建一个包含所需信息的文档
  5. 将文档添加到消息子集合中,以便用户在下次登录时可以看到他们被添加(如果他们已经有帐户则相关)。

问题在于,如果在第 3 步创建了一个新用户,他们总是在没有密码的情况下创建的,也没有姓名/电话号码等,因为俱乐部管理员不知道这些。没有密码就无法登录!解决这个问题的最佳方法是什么?我试图让后端发送一个单点登录链接,这将强制用户添加密码和所需的信息(如果它们是新的),但这似乎很困难。或者,我正在考虑让用户访问该应用程序然后进行密码重置,但这又不是很用户友好。体验必须非常简单,目前我只打算使用电子邮件/密码或可选的无密码登录。

不胜感激任何建议!

【问题讨论】:

    标签: angular firebase firebase-authentication google-cloud-functions


    【解决方案1】:

    有一个名为 createUserWithEmailAndPassword 的 Firebase 身份验证方法,它创建一个与指定电子邮件地址和密码关联的新用户帐户。成功创建用户帐户后,该用户也将登录到您的应用程序。如果帐户已存在或密码无效,则用户帐户创建可能会失败。

    您可以参考此documentation 了解更多信息。

    此外,如果您想在创建用户后更新用户详细信息,也可以查看Firebase User API Properties,这可以使用户体验更轻松。


    编辑:2021-12-10

    考虑到用例描述,有 2 种技术可能值得探索(除了前面已经推荐的电子邮件和密码技术)。验证方法的选择应该在评估用例的所有维度和适配后完成。

    • Anonymous Authentication - 此方法允许临时匿名帐户通过 Firebase 进行身份验证并浏览您的网站或应用程序。如果匿名用户决定(稍后)注册您的应用,您可以将他们的登录凭据链接到匿名帐户,以便他们可以在以后的会话中继续使用受保护的数据。

      还有一个真实用户使用匿名身份验证的案例研究。您可能还想查看here

    • Email Link Authentication - 此技术允许通过向用户发送包含链接的电子邮件来登录用户,他们可以单击该链接进行登录(无需密码)。在此过程中,还会验证用户的电子邮件地址。稍后,这种身份验证方法可能会与其他技术相关联,例如针对现有用户的电话号码身份验证或电子邮件/密码方法。

    以上两种技术可以让您不必担心生成密码和相关的安全漏洞。

    【讨论】:

    • 嗨。感谢您的回复。我知道我可以创建一个具有已定义密码的用户,但是这样做存在一些问题 - 特别是当该帐户是由其他人创建时。 + 我如何安全地生成随机密码? + 我如何告知创建的用户密码是什么?在电子邮件中发送纯文本不是最佳做法。目前我只是这样做(云功能)newUser = await admin.auth().createUser({ email }); 创建一个用户并允许我做其他后端工作现在我有他们的 UID,但他们无法登录!
    • 嗨@GuyJoseph,我已经更新了我的答案。
    猜你喜欢
    • 2018-12-18
    • 2018-10-03
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多