Firebase云功能-如何获得上传文件的用户



我有一个管理网站,可以将文件上传到Firebase Storage中的特定文件夹。

从存储云功能中,我需要从上传文件的用户那里获得经过身份验证的userId。我需要这个,因为当用户上传文件时,云功能会启动,进行一些处理,并将信息保存在实时数据库中,我需要在那里保存上传操作的负责用户。

我看到从实时数据库云函数中获取用户很简单(使用context.auth.uid(,但我没有找到任何类似于存储云函数的解决方案。

有可能吗?

Tks。

我想我会提供工作代码,因为Ali Abbas的答案并不完全正确。

在上载过程中将自定义元数据添加到文件中。必须使用customMetadata string>字符串对象,如下所示。

firebase.storage().ref("/location/path").put(file, {customMetadata: {'uid': firebase.auth().currentUser.uid}})

接下来,我们需要验证上传的所有文件都包含该元数据,并且它是准确的。以下是一条有效的存储安全规则:

allow write: if request.resource.metadata.uid == request.auth.uid

最后,从cloud函数中,以下内容将返回从文件元数据中获取的uid:

object.metadata.uid

你可以确定这是上传文件的人的uid,因为除非你使用Admin SDK,否则没有它就无法上传。

您可以将自定义元数据上传为包含字符串属性的对象:

从这里的文档:

var metadata = {
customMetadata: {
'location': 'Yosemite, CA, USA',
'activity': 'Hiking'
}
}

然后,您可以在文件(这里的文档(上使用getMetadata来检索其信息,或者例如,像下面的触发器函数中那样获取customMetadata

例如,在我的iOS应用程序中,我创建了一个StorageMetadata,并将customMetadata设置为["user":"userID_AZERRRRR"]

在我的node-js函数中,我开发了如下触发函数:

exports.testStorageOnFinalize = functions.storage.object().onFinalize(uploadedObject => {
console.log('metadata keys', Object.keys(uploadedObject.metadata));
console.log('metadata user', uploadedObject.metadata['user']);
})

在我的日志控制台中:

3:00:20.140 PM信息测试StorageOnFinalize元数据用户userID_AZERRRR

风险

根据Doug的评论,这个解决方案并不完全安全,因为元数据可能是伪造的。

因此,要解决此问题,我们可以使用存储的安全规则来检查用户是否等于已识别的用户:

// Allow reads if a certain metadata field matches a desired value
allow read: if resource.metadata.user == request.auth.uid;

你可以在这里查看存储规则

相关内容

  • 没有找到相关文章

最新更新