angular - 在 Firestore 客户端使用令牌声明和分组通知的安全性
问题描述
我已经有一个由 Ionic-Angular 开发的应用程序,并且有一个由 Nodejs 和 Mongodb 开发的 REST API。在听说 Firebase 之后,我决定以此重新开发它。
在我的旧应用程序中,我为所有客户使用了一个数据库,并将他们和他们可以通过groupId读写的数据分开。
我将他们的 groupId 保存在他们的 jwt 令牌中,并将其在请求标头中发送到后端。在后端,我将获取这个 groupId 并通过该 groupId 过滤请求的数据,或者当他们发布或放置数据时,我也会检查并使用这个 groupId。在这种情况下,他们只能查看或更改其组的数据。我还通过 Socket.io 向该特定组发送消息以更新他们的数据并获得实时数据。
我对新应用(Firebase)的问题是:
通过我从 Firestore 客户端的用户令牌获取的 group_id 设置和获取数据是否安全?(我不喜欢使用 API,因为我没有实时数据了)。用户是否可以更改 group_id 并获取其他组的数据?
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)));
}
解决方案
如果您group_id
在 Firebase 身份验证 ID 令牌中作为自定义声明传递,则只能由有权访问为其铸造该 ID 令牌的项目的管理凭据的人放入其中。用户无法根据客户端 API 或客户端 SDK 所需的配置信息更改其值。