Open4

Cloud Storage for Firebaseから公開URLと署名付きURLを発行する

Daisuke KONISHIDaisuke KONISHI

セットアップはいつもどおり。

const fireStorage = getStorage();

const bucketFile = await fireStorage.bucket().file(file as string);

const publicUrl = bucketFile.publicUrl(); // 公開URLの取得
const signedUrl = await bucketFile.getSignedUrl({ // 署名付きURLの取得
  action: 'read',
  expires: Date.now() + 1000 * 60 * 60,
});
Daisuke KONISHIDaisuke KONISHI

Storageのルールとして以下を設定してみる

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read: if request.auth != null;
    }
  }
}
Daisuke KONISHIDaisuke KONISHI

以下のようなエラーが出る

Permission 'iam.serviceAccounts.signBlob' denied on resource (or it may not exist).

実行ユーザーに権限が足りていない状態。
サービス アカウント トークン作成者 のロールが必要なようだ

「Permission 'iam.serviceAccounts.signBlob' denied on resourceエラー」の解決方法 #GoogleCloud - Qiita

コンソールからは付与できないので gcloud コマンドで付与する

gcloud projects add-iam-policy-binding PROJECT_ID \
  --member="serviceAccount:プロジェクト名@appspot.gserviceaccount.com" \
  --role="roles/iam.serviceAccountTokenCreator"
Daisuke KONISHIDaisuke KONISHI

署名付きURLは上記ロールの付与で取れるようになった

公開URLは別途対応が必要なようで、バケットの権限を調整した

バケットに対して新規プリンシパルの追加、allUsers に対して Storage Object Viewer を追加

これはFirebase側からの設定だけでは適用できないらしい