Firebase Cloud Functions-如何获取上载文件的用户?

时间:2018-12-11 11:55:21

标签: node.js firebase google-cloud-functions firebase-storage

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

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

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

有可能吗?

Tks。

2 个答案:

答案 0 :(得分:1)

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

摘自文档here

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

然后,您可以在文件(文档here)上使用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信息testStorageOnFinalize 元数据用户userID_AZERRRRR

风险

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

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

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

您可以检查存储规则here

答案 1 :(得分:0)

我想我会提供有效的代码,因为阿里·阿巴斯的答案并不完全正确。

在上传过程中将自定义元数据添加到文件中。您拥有可以使用customMetadata string> string对象,如下所示。

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

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

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

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

object.metadata.uid

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