我有一个管理网站,上传文件到火力地堡存储特定的文件夹。
从存储的云功能,我需要从上传文件的用户得到认证的用户ID。 我需要这个,因为,用户上传文件时,云功能启动时,做了一些处理,并保存信息的实时数据库,在那里我需要保存上传动作的负责用户。
我看到一个实时数据库云功能简单(使用context.auth.uid),其获得的用户,但我没有找到任何类似的解决方案,云存储功能。
可能吗?
韩国社交协会。
我有一个管理网站,上传文件到火力地堡存储特定的文件夹。
从存储的云功能,我需要从上传文件的用户得到认证的用户ID。 我需要这个,因为,用户上传文件时,云功能启动时,做了一些处理,并保存信息的实时数据库,在那里我需要保存上传动作的负责用户。
我看到一个实时数据库云功能简单(使用context.auth.uid),其获得的用户,但我没有找到任何类似的解决方案,云存储功能。
可能吗?
韩国社交协会。
您可以上传自定义元数据包含字符串属性的对象:
从技术文档在这里 :
var metadata = {
customMetadata: {
'location': 'Yosemite, CA, USA',
'activity': 'Hiking'
}
}
然后你可以使用getMetadata
上的文件(DOC的位置 )来检索其信息或例如获得customMetadata
像我下面的触发功能。
例如并且从我的iPhone应用程序,我创建一个StorageMetadata
和予设定的customMetadata
到["user":"userID_AZERRRRR"]
在我的节点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
风险
从道格评论,这个解决方案不是完全安全的,因为元数据可能被伪造。
因此, 要解决这个问题 ,我们可以使用安全规则的存储,以检查用户是否等于识别的用户:
// Allow reads if a certain metadata field matches a desired value
allow read: if resource.metadata.user == request.auth.uid;
您可以查看存储的规则在这里
我以为我会提供工作代码,阿里阿巴斯的答案是不完全正确。
在上传过程中添加自定义的元数据文件。 你必须使用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
最后,从云功能,下面就返回从文件的元数据所采取的UID:
object.metadata.uid
你可以肯定,这是谁上传的文件,因为他们不能没有它,除非你正在使用管理SDK上传者的UID。