在Firebase Firestore中强制使用唯一用户标识

在Firebase Firestore中强制使用唯一用户标识,firebase,google-cloud-firestore,Firebase,Google Cloud Firestore,我正在使用Firebase的新Firestore数据库,想知道是否有更有效的方法来强制使用唯一的用户名(或唯一的子节点) 我使用电子邮件/密码验证,但允许用户创建一个独特的句柄,如Twitter 使用实时数据库,我能够通过事务和多节点结构实现这一点 -users -uid1234: -username: ryan -usernames: -ryan: uid1234 我在想,在Firestore中使用文档作为用户名时,不需要额外的用户名节点就可以做到这一点 你

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

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

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

-users
    -uid1234:
        -username: ryan

-usernames:
    -ryan: uid1234

我在想,在Firestore中使用文档作为用户名时,不需要额外的
用户名
节点就可以做到这一点

你可以用两种方法来做。如果用户存在于具有用户名的集合中,请在创建用户之前使用单独的调用进行检查

您还可以创建如下规则:

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

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

你可以用两种方法来做。如果用户存在于具有用户名的集合中,请在创建用户之前使用单独的调用进行检查

您还可以创建如下规则:

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

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

请问为什么是“唯一用户名”?在哪种可能的用法中,您希望避免两个用户具有相同的名称?IMHO用户标识应该使用userID而不是username。如果问题不清楚,请道歉。我仍然希望使用身份验证时生成的Firebase用户名,但希望用户能够创建一个独特的“句柄”,如Twitter或Instagram。真正的问题是:如何仅使用服务器端规则强制使用唯一的用户名。检查客户端中是否存在用户名映射是不安全的。如果您已经有了解决方案,您介意发布吗?@crazypeter可以使用实时数据库中的事务在客户端执行此操作:。有一些答案更详细地说明了这一点。我正在Firestore数据库中寻找一种更干净的方法(没有额外的“用户名节点”)。请问为什么是“唯一用户名”?在哪种可能的用法中,您希望避免两个用户具有相同的名称?IMHO用户标识应该使用userID而不是username。如果问题不清楚,请道歉。我仍然希望使用身份验证时生成的Firebase用户名,但希望用户能够创建一个独特的“句柄”,如Twitter或Instagram。真正的问题是:如何仅使用服务器端规则强制使用唯一的用户名。检查客户端中是否存在用户名映射是不安全的。如果您已经有了解决方案,您介意发布吗?@crazypeter可以使用实时数据库中的事务在客户端执行此操作:。有一些答案更详细地说明了这一点。我正在Firestore数据库中寻找一种更干净的方法(没有额外的“用户名节点”)。