Node.js Firebase云功能-如何让用户上传文件?

Node.js Firebase云功能-如何让用户上传文件?,node.js,firebase,google-cloud-functions,firebase-storage,Node.js,Firebase,Google Cloud Functions,Firebase Storage,我有一个管理员网站,可以将文件上传到Firebase存储中的特定文件夹 从存储云函数中,我需要从上传文件的用户那里获取经过身份验证的userId。我需要这样做是因为,当用户上传文件时,云功能启动,进行一些处理,并将信息保存在实时数据库中,我需要保存上传操作的负责用户 我看到从实时数据库云函数获取用户很简单(使用context.auth.uid),但我没有找到任何类似的存储云函数解决方案 可能吗 Tks.您可以将自定义元数据作为包含字符串属性的对象上载: 从文件: 然后,您可以在文件(文档)上使用

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

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

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

可能吗


Tks.

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

从文件:

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

例如,在我的iOS应用程序中,我创建了一个
StorageMetadata
,并将
customMetadata
设置为
[“用户”:“userID\u azerrr”]

在我的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信息testStorageOnFinalize元数据用户userID\u azerrr

风险

从Doug comment来看,这个解决方案并不完全安全,因为元数据可能是伪造的

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

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

您可以检查存储规则

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

在上载期间向文件添加自定义元数据。您必须使用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
最后,从cloud函数中,以下内容将返回从文件元数据中获取的uid:

object.metadata.uid

您可以确定这是上传文件的人的uid,因为除非您使用的是Admin SDK,否则无法在没有该uid的情况下上传文件。

目前没有与云存储触发的云功能相关联的用户的元数据。解决方法是在路径中传递有关用户的信息,使用以确保它们是准确的。Tks@Frank!但我的问题是,经过身份验证的用户在我的存储中没有路径,我正试图避免创建此路径,上载文件,然后将其移动到正确的管理员路径以获取用户ID。如果您希望UID以安全的方式,您必须以某种方式将其传入,无论是在路径中还是在元数据中。我非常确定给定的答案是正确的。它演示了如何将uid添加到元数据中,并使用安全规则来确保其正确性。这里的问题是,任何人都可以伪造元数据以假装它们是另一种用途,因此此解决方案不是完全安全的。谢谢Doug,我们可以用一些安全规则来完成此解决方案吗?可能。为什么不查阅“存储安全规则参考”以查看是否有任何方法可以访问正在上载的文件的元数据?确实是的,所以我们可以检查一下,例如,metadata.user=request.auth.uid听起来像是对您的答案的一个很好的补充。
object.metadata.uid