小编ern*_*ton的帖子

群组的 Firebase 存储安全规则

我知道对此有几个问题(例如/sf/answers/3696600071/),但我仍然没有很好的解决方案。

我的应用程序有Groups,它们是动态创建/删除的,并且可以随时添加/删除成员(用户)。

每个Group 有 0..N 个私有文件(Firebase Storage),保存在不同的路径中(都带有前缀groups/{groupId}/...)。

在 Firestore 安全规则中,我使用get()&exists()来了解登录用户是否属于某个组。但我无法在 Firebase 存储安全规则中执行此操作。

2个建议的解决方案是:

  • 用户声明:

但是令牌需要刷新(注销/登录,或更新过期的令牌),这对我的用例来说是不可接受的,因为用户一旦受到邀请就需要立即访问。此外,一个用户可以是许多组的一部分,这些组可能会增长超过 1000 字节。

  • 文件元数据:

但是组可以在不同的路径中有 N 个文件,因此我需要循环列出组的所有文件,并在每个文件的元数据中设置组成员的用户 ID,以允许对其进行访问。当添加/删除成员时,这将是由 Firestore(一个 Firebase 函数)触发的操作。

我不喜欢这种方法,因为:

  • 需要循环列出 N 个文件并为每个文件设置元数据(性能不高)
  • 要添加新文件,我想我需要设置create为 public(因为还没有要检查的元数据),然后需要触发一个函数来将 userIds 添加到元数据
  • 授予文件访问权限可能会有几秒钟的延迟,在我的情况下,如果用户在此之前打开群组页面,体验不佳,这可能会导致问题

所以,我的问题是:

  1. 有没有更好的办法?
  2. 如果我只允许客户端getcreate所有文件在身份验证时(不允许deletelist),这是否足以保证安全?我认为恶意黑客可能有可能通过匿名用户上传任何内容,或者如果他们知道路径,则可能会读取所有私人组文件......

谢谢!

firebase firebase-security firebase-storage google-cloud-firestore

7
推荐指数
1
解决办法
643
查看次数

Firebase 一次性函数

我确信这些是常见的场景,但在研究了几个小时后,我无法真正找到常见的做法是什么。也许在 Firebase 方面有更多经验的人可以为我指明正确的方向。

我有两个特定的场景:

1. 运行一次的代码

示例 1:向 firestore 中的所有用户添加新数据,这是新功能所需的
示例 2:开始将数据复制到现有文档中

我目前在云函数中编写代码,并在 firestore 事件(onUpdate“隐藏”文档的)上运行它,然后如果一切顺利,我会立即删除该函数。

我还增加了这个函数的超时和内存,因为这个想法是潜在地更新数百万个文档。

2. 从 firebase 控制台(或命令行)手动触发功能

示例:在应用程序中授予用户管理员权限(设置自定义声明和 Firestore 数据的功能)。我们没有时间实施后台,因此从 firebase 门户网站/控制台执行此操作是理想的,指定用户 ID。

我当前的解决方案是使用https function,并从 GCP 门户运行它(在函数的“测试”选项卡上,能够传递 json)。但是该功能可以公开触发,我真的不喜欢......

这些场景的常见做法是什么?

firebase google-cloud-functions firebase-admin google-cloud-firestore

7
推荐指数
1
解决办法
858
查看次数

在 iOS 13 中暂停/停止 AVAudioEngine 时,状态栏会显示麦克风图标片刻

每次我停止/暂停音频引擎(使用AVAudioEnginesstop()pause())时,状态栏上都会出现一个红色的麦克风图标一秒钟。

一段时间后,这开始很烦人,每次我暂停/停止引擎时,顶部都会出现红色。

在 iOS 13 中启用音频背景模式功能时会发生这种情况。

在此处输入图片说明

要重现这一点,请创建一个新的单视图项目,并将其添加到视图控制器:

private let engine = AVAudioEngine()
Run Code Online (Sandbox Code Playgroud)

而在viewDidAppear

engine.connect(
   engine.inputNode, 
   to: engine.mainMixerNode, 
   format: engine.inputNode.inputFormat(forBus: 0)
)
try? engine.start()

DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
   self.engine.pause() // or self.engine.stop()
}
Run Code Online (Sandbox Code Playgroud)

记住要启用音频背景模式,添加NSMicrophoneUsageDescriptionInfo.plist,并在iOS的13设备上运行。接受麦克风权限并重新运行应用程序。您将看到红色麦克风图标闪烁一次。

有没有办法摆脱这个?

swift avaudioengine ios13

6
推荐指数
0
解决办法
634
查看次数

应用程序传输钥匙串丢失:用户注销的解决方案

我将应用程序转移到新的开发者帐户。当我从新的开发者帐户上传构建并通过 Testflight 部署它时,我遇到用户从应用程序注销的情况。

\n

我认为这是由于钥匙串丢失造成的,因为Team ID发生了变化。因此,我联系了Apple,他们说无法访问新开发者帐户中的旧钥匙串,但我可以将应用程序转移回我的旧开发者帐户。

\n

这对我们来说确实很糟糕,因为我们在设备中保存了用户创建的数据,这些数据在注销时会丢失。我们还有匿名用户,他们甚至无法重新获得对其帐户的访问权限,因为没有登录凭据。这对我们来说是不可接受的,因为我们会丢失用户数据,但我们还需要将应用程序转移到新的开发者帐户......因此我们正在尝试寻找可能的解决方案。

\n

可能的解决方案#1

\n

远非理想:例如,继续使用旧的开发者帐户一个月,并显示一条警告,内容如下:

\n
\n

请保存/备份您的所有数据并注册(如果您有匿名\n帐户),因为由于迁移,所有未保存的数据将在[今天日期 + 1\n个月]丢失。带来不便敬请谅解。

\n
\n

一个月后,我们再次转账到新的开发者账户。当月没有看到该消息或没有保存数据的用户,再见数据\xe2\x80\xa6 可怕。

\n

可能的解决方案#2

\n

我不确定 Firebase Auth iOS SDK 是否具有执行以下操作的 API:

\n
    \n
  1. 将应用程序再次转移回旧的开发者帐户
  2. \n
  3. 从那里上传一个新版本,将 Firebase 身份验证状态(例如令牌)临时保存在文件中(我知道它不安全......也许我可以加密它)
  4. \n
  5. 再次将应用转移回新的开发者帐户
  6. \n
  7. 上传一个新版本,检查该文件是否存在,然后再次将身份验证状态复制到 Firebase 身份验证 SDK 中。这样用户仍然保持登录状态,就好像什么也没发生一样。
  8. \n
\n

第二种解决方案有点不安全、复杂且难以测试,但从用户的角度来看,它比第一种解决方案更理想(如果一切顺利的话)。

\n

所以,我的具体问题是:

\n
    \n
  1. 解决方案 #2 可以通过 Firebase Auth 实现吗?
  2. \n
  3. 有人对如何解决这个问题有更多的想法吗?我想传输应用程序(通过登录)是一个常见的用例!
  4. \n
\n

我们目前仅使用匿名和电子邮件/密码身份验证方法。

\n

谢谢!

\n

keychain ios app-transfer firebase-authentication

5
推荐指数
1
解决办法
1665
查看次数