如何在Firebase云函数中获取Firebase Storage生成的下载链接
原因说明
mediaLink是Google Cloud Storage的原生资源链接,默认要求请求携带身份认证凭证、且拥有对应资源的storage.objects.getIAM权限才能访问,和Flutter端getDownloadUrl()、Firebase控制台提供的匿名可访问下载链接逻辑不同,所以直接用会报匿名用户无权限的错误。
解决方法
使用Firebase Admin SDK中存储文件实例的getSignedUrl()方法生成符合要求的下载链接,生成的链接自带签名令牌,无需额外身份校验即可访问,和Firebase控制台、Flutter端获取的下载链接效果完全一致。
修改后的代码示例
exports.generateThumbnail = functions.storage.object().onFinalize(async (object) => { const db = admin.firestore(); const filePath = object.name; const contentType = object.contentType; const fileDir = path.dirname(filePath); const fileName = path.basename(filePath); const jobId = fileName.replace("poster_","").replace(".png",""); const bucket = admin.storage().bucket(object.bucket); const file = bucket.file(filePath); // 配置签名URL参数 const signedUrlOptions = { action: 'read', expires: '01-01-2500' // 可自定义有效期,设置为极晚日期即可实现近似永久可用 }; // 生成下载链接 const [posterFileUrl] = await file.getSignedUrl(signedUrlOptions); // 此处写入Firestore对应文档即可 await db.collection('你的集合名').doc(jobId).set({ posterUrl: posterFileUrl }, { merge: true }); functions.logger.log('生成的下载链接: '+ posterFileUrl ); return null; });
注意事项
- Cloud Function默认使用的服务账号默认拥有存储桶的读取权限,无需额外配置权限即可正常生成签名URL
- 如果后续需要禁用某个已生成的下载链接,在Firebase Storage控制台找到对应文件,撤销公开访问令牌即可
内容的提问来源于stack exchange,提问作者Jolzal
相关产品推荐
相关产品推荐

