【问题标题】:Enforcing unique userIds in Firebase Firestore在 Firebase Firestore 中强制执行唯一身份用户
【发布时间】:2018-04-28 04:00:33
【问题描述】:

我正在使用 Firebase 的新 Firestore 数据库,想知道是否有更有效的方法来强制执行唯一用户名(或唯一子节点)。

我使用电子邮件/密码验证,但允许用户创建一个独特的句柄,例如 Twitter。

使用实时数据库,我能够通过事务和多节点结构来实现这一点。

-users
    -uid1234:
        -username: ryan

-usernames:
    -ryan: uid1234

我在想,如果没有额外的 usernames 节点,使用文档作为 Firestore 中的用户名,也许可以做到这一点。

【问题讨论】:

  • 请问为什么是“唯一用户名”?您希望在哪些可能的用途中避免两个用户同名?恕我直言,用户标识应使用用户 ID 而不是用户名。
  • 对不起,如果问题不清楚。我仍然想使用身份验证时生成的 Firebase userId,但希望用户能够创建一个独特的“句柄”,如 Twitter 或 Instagram。
  • 真正的问题是:如何仅使用服务器端规则强制执行唯一用户名。如果存在用户名映射,则签入客户端是不安全的。如果您已经有解决方案,您介意发布吗?
  • @crazypeter 可以使用实时数据库中的事务在客户端执行此操作:firebase.google.com/docs/database/ios/…。那里有一些 SO 答案更详细地显示了这一点。我正在 Firestore 数据库中寻找一种更简洁的方式(没有额外的“用户名节点”)。

标签: firebase google-cloud-firestore


【解决方案1】:

您可以通过 2 种方式做到这一点。如果用户存在于具有用户名的集合中,请在创建用户之前使用单独的调用进行检查。

您也可以创建如下规则:

match /users/{document=**} {
    allow create: if !exists(/databases/$(database)/documents/usernames/$(request.resource.data.username));
}

在这种情况下,如果用户名在创建时已经存在并且您可以在代码中捕获,则会返回错误。

【讨论】:

    猜你喜欢
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多