Cloud Storage Admin:对象访问令牌以生成下载链接

问题描述

我正在将Firebase Storage用于我的客户端应用程序,以将视频上传到Cloud Storage。 在上载时,我使用storageRef.getDownloadURL()从客户端生成一个下载链接,并将其添加到Firestore文档中。视频上传后,将触发云功能来处理视频。之后将其覆盖到Cloud Storage。到那时,我认为先前版本的访问令牌已被撤消,如果我尝试通过我保存在Firestore中的链接加载视频,则无法正确加载。我考虑的两个解决方案是1.从Cloud Functions中的admin API中以某种方式生成链接并更新db,或者2.使用某些标志/选项覆盖gcs对象而不丢失其凭证。但是我不确定如何做这两个。

这是我最初从客户端(Dart) 上传文件的方式:

final StorageReference storageRef = FirebaseStorage.instance
        .ref()
        .child('/challenge_proofs/${topic['id']}/${user.uid}/$fileId');

final StorageUploadTask uploadTask = storageRef.putFile(_video);
await uploadTask.onComplete;

print('Upload Status:');
print(uploadTask.isSuccessful);

storageRef.getDownloadURL().then((dynamic fileURL) async {
  print('Add fileURL to db here');
});

这是我将视频文件从Cloud Functions覆盖到存储(TypeScript)方法

// Inside triggered Cloud Function

const remoteFilename = `challenge_proofs/${proofData['challengeId']}/${proofData['ownerId']}/${proofData['mediaId']}`;
const generatedOutput = join(tmpdir,"videogen.mp4");
let downloadDest = '';

await bucket.file(remoteFilename).download({ destination: downloadDest });
// DOING FILE PROCESSING //
await bucket.upload(generatedOutput,{ destination: remoteFilename,resumable: false });

这是我的Firebase存储规则:

rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read,write: if false;
    }
    
    match /challenge_proofs/{challengeId}/{userId}/{allPaths=**} {
      allow read,write: if request.auth != null && request.auth.uid == userId;
    }
  }
}

我注意到,在Firebase控制台中,客户端上传后有一个对象“访问令牌”,而在覆盖后消失了。

用户赞扬之后:

enter image description here

管理员(云功能上传后:(无“访问令牌”)

enter image description here

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...