Cloud Firestore:强制执行唯一的用户名

2024-05-18

问题

我已经多次看到这个问题(也在 Firebase 实时数据库的上下文中),但我还没有看到令人信服的答案。问题陈述相当简单:

(经过身份验证的)用户如何选择尚未被占用的用户名?

首先,why:用户通过身份验证后,拥有唯一的用户ID。然而,许多网络应用程序让用户选择“显示名称”(用户希望在网站上显示的方式),以保护用户的个人数据(例如真实姓名)。

用户集合

给定如下的数据结构,可以为每个用户存储用户名以及其他数据:

/users  (collection)
    /{uid}  (document)
        - name: "<the username>"
        - foo: "<other data>"

然而,没有什么可以阻止另一个用户(具有不同的{uid})存储相同的name在他们的记录中。据我所知,没有任何“安全规则”可以让我们检查是否name已被其他用户使用。

注意:客户端检查是可能的,但不安全,因为恶意客户端可能会忽略检查。

反向映射

流行的解决方案是创建具有反向映射的集合:

/usernames  (collection)
    /{name}  (document)
       - uid: "<the auth {uid} field>"

鉴于此反向映射,可以编写安全规则来强制用户名尚未被使用:

match /users/{userId} {
  allow read: if true;
  allow create, update: if
      request.auth.uid == userId &&
      request.resource.data.name is string &&
      request.resource.data.name.size() >= 3 &&
      get(/PATH/usernames/$(request.resource.data.name)).data.uid == userId;
}

并强制用户首先创建用户名文档:

match /usernames/{name} {
  allow read: if true;
  allow create: if
      request.resource.data.size() == 1 &&
      request.resource.data.uid is string &&
      request.resource.data.uid == request.auth.uid;
}

我相信解决方案已经成功一半了。然而,仍有一些未解决的问题。

剩余问题/疑问

这个实现已经相当复杂,但它甚至没有解决用户想要的问题更改他们的用户名(需要记录删除或者更新规则等)

另一个问题是,没有什么可以阻止用户在usernames收集,有效地抢夺所有好的用户名来破坏系统。

那么对于问题:

  • 是否有更简单的解决方案来强制执行唯一用户名?
  • 怎样才能发送垃圾邮件usernames收集被阻止?
  • 如何使用户名检查不区分大小写?

我也尝试强制执行users, 和另外一个exists()/usernames 集合的规则,然后提交批量写入操作,但是,这似乎不起作用(“权限缺失或不足“ 错误)。

另请注意:我已经看到了带有客户端检查的解决方案。但这些都是不安全的。任何恶意客户端都可以修改代码并忽略检查。


@asciimikeTwitter 上是 Firebase 安全规则开发人员。 他说,目前还没有办法强制文档上的键的唯一性。https://twitter.com/asciimike/status/937032291511025664 https://twitter.com/asciimike/status/937032291511025664

Since firestore基于谷歌云datastore它继承了这个问题。自 2008 年以来,这是一个长期存在的要求。https://issuetracker.google.com/issues/35875869#c14 https://issuetracker.google.com/issues/35875869#c14

但是,您可以通过使用来实现您的目标firebase functions还有一些严格的security rules.

您可以在 Medium 上查看我提出的整个解决方案。https://medium.com/@jqualls/firebase-firestore-unique-constraints-d0673b7a4952 https://medium.com/@jqualls/firebase-firestore-unique-constraints-d0673b7a4952

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Cloud Firestore:强制执行唯一的用户名 的相关文章

  • 链接器命令失败,退出代码为 1 -- Firebase

    对 iOS 开发相当陌生 有些人在将 firebase 安装到我的 iOS 应用程序中时遇到了一些麻烦 本质上 该应用程序要做的就是从 Firebase 数据库中获取有关全国各地路线的信息 该信息将输出到表格视图 该表格视图将允许用户选择其
  • Metro 遇到错误:尝试解析模块“firebase”时

    启动模拟器后出现此错误 我在图像下添加代码并在终端上出错 这是我的 App js 文件模拟器上的错误图像 https i stack imgur com pffip png 错误 错误 尝试解析模块时firebase从文件 Users ca
  • Firestore 每秒向一个集合写入 500 多次以上

    Firestore 的限制为每秒 500 次写入 to 一个集合 其中文档包含顺序值 索引字段 https cloud google com firestore quotas writes and transactions https cl
  • Angular Firebase 使用电话号码登录

    我是这个网站的新手 所以如果我犯了错误 请纠正我 我会修复它 并原谅我 我也是 Angular 4 环境的新手 Firebase 有一个新选项 signInWithPhoneNumber 我想在我的新应用程序上实现它 该方法需要参数 sig
  • 如何禁用 Firebase 电话身份验证 reCAPTCHA? (网络/反应)

    我正在构建一个 React Firebase 应用程序并使用 Firebase 的 PhoneAuthProvider 进行身份验证 在开发过程中 需要进行大量的登录和注销来测试身份验证流程 私有路由 登录重定向等 每次我需要登录时 都会向
  • 在 Swift 应用程序中从 Excel 文档读取数据

    我有一个 Excel 文档 其中包含一些表格和大量数据点 我想从中读取内容以填充一些 UICollectionView 单元格和我的应用程序的其他部分 就像是 Country Temperature Cost Spain 23 80 Fra
  • Flutter firestore插件无法通过where和isEqualTo的组合来获取数据

    我在 Firestore 中有一个名为 trips 的集合 数据格式是这样的 我正在尝试使用下面的代码访问该集合的文档 第一种方式 try Firestore instance collection trips where createdB
  • iOS 是否有像 Android 一样的应用内更新功能?

    我为 Android 和 iOS 开发了一个移动应用程序 现在每周我们都会发布 2 个更新 大多数时候 Android 和 iOS 用户会停止应用程序的自动更新 但是 如果有重要更新或错误修复或新功能 那么我们必须要求用户更新应用程序以获得
  • 类型“AngularFirestoreCollection”上不存在属性“onSnapshot”

    我正在尝试将侦听器与云 Firebase 分离 但仍然收到此错误 类型 AngularFirestoreCollection 上不存在属性 onSnapshot 你知道我应该进口什么吗 我直接从 Firebase 文档中复制此代码 let
  • Flutter:未捕获的 ReferenceError:firebase 未定义

    我在 Flutter Web 应用程序中使用 Firebase 服务 但在加载 Firebase 脚本时遇到问题 当我使用扑动时运行 d chrome我看到有错误的空白页面 重新加载页面后加载正常 当我进行 flutter build we
  • 在设置中禁用推送通知后,推送通知是否会发送到 Android 手机?

    在 Android 中 如果我们使用操作系统设置禁用应用程序通知 fcm gcm 是否仍会将通知发送到设备 如果发送到设备 通知是否会传递到应用程序 还是操作系统阻止了它 device token是否失效 我假设当我们禁用通知时 Andro
  • Firebase 远程配置 - 初始获取返回本地默认值

    我正在使用 Firebase 远程配置来获取远程数据 并且我的应用程序需要首次启动时的最新数据 我正在我的应用程序中进行获取和更新onCreate mFirebaseRemoteConfig fetch cacheExpiration ad
  • Firestore 中的多租户

    关于基于子集合值查询数据的实际限制 在 Firestore 中管理多租户的建议方法是什么 我希望能够检索和限制对与用户所属实体 公司相关的数据的访问 数据结构示例 companies companyId users companies co
  • Cloud Functions for Firebase - 通过 Nodejs/Cloud Function 将多个 PDF 合并为一个

    我遇到了一个问题 我试图通过云功能合并一堆 PDF 然后将合并的 PDF 下载到用户的计算机上 我的提供程序中有一个函数 它调用云函数并传递指向 pdf 的 URL 数组 如下所示 mergePDFs pdfs Create array o
  • 如何解决 Firebase AuthUi 中无法找到显式活动?

    使用 firebase UI 时 我无法找到显式活动类 com firebase ui auth KickoffActivity protected void onCreate Bundle savedInstanceState super
  • 如何在 Android 模块中使用 FirebaseAuth

    我正在开发一个聊天库 我想在其中显示登录用户的对话 制作该库的原因是我想将其集成到多个项目中 我现在面临的问题是FirebaseAuth表示用户尚未登录 FirebaseAuth getInstance mFirebaseApp getCu
  • 为 Node.js 客户端应用程序保留 Firebase 用户

    我正在使用 Firebase 构建 Node js 命令行界面 CLI 用于与后端进行身份验证 我想避免让用户每次运行命令时都输入密码 相反 我想实现一个 登录 流程 将凭证保留到文件系统 该凭证可用于后续的无密码身份验证 直到用户 注销
  • 模块中的类无法加载

    我正在开发一个 2D Unity android 游戏 其中我最近添加了 Firebase Beta SDK 但添加后FirebaseAnalytics unitypackage我面临的错误是 无法加载模块中的类 当我删除文件夹时Fireb
  • 谷歌云功能发送重复通知

    我有一个发送主题通知的 gcf 我从管理 Android 应用程序触发该功能 一切都按预期工作 但突然该函数发送通知两次 有时三次 谷歌云上的函数日志显示该函数已发送一条通知 它只打印一行 定制发送成功 但 Android 应用程序会收到多
  • 使用 Hooks 从 React Native 中的 Firebase 实时数据库获取的数据未显示在屏幕上

    我最近开始在 React Native 中使用 Hooks 并尝试从 Firebase 实时数据库获取数据并将其呈现在 FlatList 中 数据以对象格式显示在控制台上 但它不起作用 它没有呈现在屏幕上 我究竟做错了什么 我怎样才能让它正

随机推荐