【问题标题】:Safety of using token claims in Firestore client side and grouping notifications在 Firestore 客户端使用令牌声明和分组通知的安全性
【发布时间】:2020-06-14 15:34:53
【问题描述】:

我已经有一个由 Ionic-Angular 开发的应用程序,并且有一个由 Nodejs 和 Mongodb 开发的 REST API。在听说 Firebase 之后,我决定以此重新开发它。

在我的旧应用中,我为所有客户使用了一个单个数据库,并通过 groupId 将他们和他们可以读写的数据分开。

我将他们的 groupId 保存在他们的 jwt 令牌中,并在请求标头中将其发送到后端。在后端,我将获取这个 groupId 并通过该 groupId 过滤请求的数据,或者当他们发布或放置数据时,我也会检查并使用这个 groupId。在这种情况下,他们只能查看或更改其组的数据。我还通过 Socket.io 向该特定组发送消息以更新他们的数据并获得实时数据。

我对新应用 (Firebase) 的问题是:

  1. 通过我从 Firestore 客户端的用户令牌获取的 group_id 设置和获取数据是否安全? (我不喜欢使用 API,因为我没有实时数据了)。用户是否可以更改 group_id 并获取其他组的数据?

  2. Firebase 会通知所有用户有关更改并刷新他们的数据以获取更新,并且他们拥有实时数据。就我而言,我需要更新其数据已更改的特定组的数据。是否可以这样做,或者当数据库发生更改时,所有组中的所有用户总是刷新他们的数据?

已编辑:

这是代码示例。 我需要知道恶意用户是否可以更改我在“where”中发送的值。 如果是,如果使用 firebase 规则读取数据,我该如何保护?

    loadAllUnits(): Observable<Unit[]> {                      
        return this.db.collection(
            'units',
                ref => ref.orderBy("name")
                .where('groupId', '==', this.authService.currentUser.value.groupId)
            )            
            .snapshotChanges()
            .pipe(
                map(snaps => convertSnaps<Unit>(snaps)));
    }

【问题讨论】:

  • 第一个问题的答案如下。第二个问题听起来可能,但以目前的形式回答太宽泛了。我建议您尝试实施它,如果遇到困难,请回复一个更具体的问题。

标签: angular firebase ionic-framework google-cloud-firestore firebase-authentication


【解决方案1】:

如果您在 Firebase 身份验证 ID 令牌中将 group_id 作为自定义声明传递,则只能由有权访问为其铸造该 ID 令牌的项目的管理凭据的人将其放入其中。用户无法根据客户端 API 或客户端 SDK 所需的配置信息更改其值。

【讨论】:

  • 您好,感谢您的回答。实际上我知道用户不能在令牌中更改它。但是,如果在我将它作为参数发送的地方,用户发送了其他东西怎么办?对于写入数据,我可以将检查与后端的规则进行比较。但是对于读取数据,我不知道如何实现这个规则。
  • 所有与身份验证集成的 Firebase 服务都会对 ID 令牌进行解码,并在使用其任何数据之前验证它是否已正确签名。如果用户无法访问您的项目凭据,则无法将任何信息注入此过程。如果您正在考虑另一个过程,请编辑您的问题以显示它是如何工作的。最好在代码中,因为到目前为止,我发现很难从您的描述中解析恶意用户会做什么。
  • 您好,问题已编辑。举个例子,也许你会更好地理解我的意思。
  • 您可以根据其令牌中自定义声明的值检查服务器端安全规则中的过滤器。所以类似于resource.data.groupId == request.auth.token.groupId(我没有运行它,所以请仔细检查文档和模拟器)。
  • 我在无法按安全规则过滤数据的地方发红。但我会试试这个,让你知道。谢谢你的时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-18
  • 1970-01-01
  • 1970-01-01
  • 2013-08-19
  • 1970-01-01
  • 2013-02-01
  • 2017-01-30
相关资源
最近更新 更多