この回答では、ファイルをGoogle / Firebase Cloud StorageにアップロードするときにダウンロードURLを取得するためのオプションをまとめています。ダウンロードURLには3つのタイプがあります。
- 署名付きダウンロードURL。これは一時的なものであり、セキュリティ機能があります。
- 永続的でセキュリティ機能を備えたトークンダウンロードURL
- 永続的でセキュリティに欠ける公開ダウンロードURL
トークンのダウンロードURLを取得するには3つの方法があります。他の2つのダウンロードURLは、それらを取得する1つの方法しかありません。
Firebase Storageコンソールから
Firebase StorageコンソールからダウンロードURLを取得できます。
ダウンロードURLは次のようになります。
https://firebasestorage.googleapis.com/v0/b/languagetwo-cd94d.appspot.com/o/Audio%2FEnglish%2FUnited_States-OED-0%2Fabout.mp3?alt=media&token=489c48b3-23fb-4270-bd85-0a328d2808e5
最初の部分は、ファイルへの標準パスです。最後はトークンです。このダウンロードURLは永続的です。つまり、失効させることはできませんが、失効させることはできません。
フロントエンドからのgetDownloadURL()
ドキュメントが使用に教えてくれるgetDownloadURL()
。
let url = await firebase.storage().ref('Audio/English/United_States-OED-' + i +'/' + $scope.word.word + ".mp3").getDownloadURL();
これにより、Firebase Storageコンソールから取得できるのと同じダウンロードURLが取得されます。この方法は簡単ですが、比較的単純なデータベース構造のために、ファイルへのパス(このアプリでは約300行のコード)を知っている必要があります。データベースが複雑な場合、これは悪夢になります。また、フロントエンドからファイルをアップロードすることもできますが、これにより、アプリをダウンロードするすべての人に資格情報が公開されます。したがって、ほとんどのプロジェクトでは、NodeバックエンドまたはGoogle Cloud Functionsからファイルをアップロードし、ダウンロードURLを取得して、ファイルに関する他のデータと一緒にデータベースに保存します。
一時ダウンロードURLのgetSignedUrl()
getSignedUrl()は、NodeのバックエンドまたはGoogle Cloud Functionsから簡単に使用できます。
function oedPromise() {
return new Promise(function(resolve, reject) {
http.get(oedAudioURL, function(response) {
response.pipe(file.createWriteStream(options))
.on('error', function(error) {
console.error(error);
reject(error);
})
.on('finish', function() {
file.getSignedUrl(config, function(err, url) {
if (err) {
console.error(err);
return;
} else {
resolve(url);
}
});
});
});
});
}
署名付きダウンロードURLは次のようになります。
https://storage.googleapis.com/languagetwo-cd94d.appspot.com/Audio%2FSpanish%2FLatin_America-Sofia-Female-IBM%2Faqu%C3%AD.mp3?GoogleAccessId=languagetwo-cd94d%40appspot.gserviceaccount.com&Expires=4711305600&Signature=WUmABCZIlUp6eg7dKaBFycuO%2Baz5vOGTl29Je%2BNpselq8JSl7%2BIGG1LnCl0AlrHpxVZLxhk0iiqIejj4Qa6pSMx%2FhuBfZLT2Z%2FQhIzEAoyiZFn8xy%2FrhtymjDcpbDKGZYjmWNONFezMgYekNYHi05EPMoHtiUDsP47xHm3XwW9BcbuW6DaWh2UKrCxERy6cJTJ01H9NK1wCUZSMT0%2BUeNpwTvbRwc4aIqSD3UbXSMQlFMxxWbPvf%2B8Q0nEcaAB1qMKwNhw1ofAxSSaJvUdXeLFNVxsjm2V9HX4Y7OIuWwAxtGedLhgSleOP4ErByvGQCZsoO4nljjF97veil62ilaQ%3D%3D
署名付きURLには、有効期限と長い署名があります。コマンドラインgsutil signurl -dのドキュメントは、署名付きURLは一時的なものであると記載されています。デフォルトの有効期限は1時間、最大有効期限は7日です。
ここで、署名されたURLが1週間で期限切れになることをgetSignedUrlが決して言わないようにします。文書コードには3-17-2025
有効期限があり、将来の有効期限を設定できることを示しています。私のアプリは完全に動作し、1週間後にクラッシュしました。エラーメッセージは、署名が一致しなかったことを示しており、ダウンロードURLの有効期限が切れていることを示していません。私はコードにさまざまな変更を加え、すべてが機能しました...すべてが1週間後にクラッシュするまで。これは1か月以上続いた欲求不満でした。
ファイルを公開する
ドキュメントで説明されているように、ファイルの権限を公開読み取りに設定できます。これは、クラウドストレージブラウザまたはノードサーバーから実行できます。1つのファイル、ディレクトリ、またはストレージデータベース全体をパブリックにすることができます。ここにノードコードがあります:
var webmPromise = new Promise(function(resolve, reject) {
var options = {
destination: ('Audio/' + longLanguage + '/' + pronunciation + '/' + word + '.mp3'),
predefinedAcl: 'publicRead',
contentType: 'audio/' + audioType,
};
synthesizeParams.accept = 'audio/webm';
var file = bucket.file('Audio/' + longLanguage + '/' + pronunciation + '/' + word + '.webm');
textToSpeech.synthesize(synthesizeParams)
.then(function(audio) {
audio.pipe(file.createWriteStream(options));
})
.then(function() {
console.log("webm audio file written.");
resolve();
})
.catch(error => console.error(error));
});
結果はCloud Storageブラウザでは次のようになります。
だれでも標準パスを使用してファイルをダウンロードできます。
https://storage.googleapis.com/languagetwo-cd94d.appspot.com/Audio/English/United_States-OED-0/system.mp3
ファイルをパブリックにするもう1つの方法は、メソッドmakePublic()を使用することです。これを機能させることができませんでした。バケットとファイルのパスを正しく取得するのは難しいです。
興味深い代替手段は、アクセス制御リストを使用することです。リストに入れたり、使用したユーザーだけがファイルを利用できるようにすることができますauthenticatedRead
、Googleアカウントからログインしているすべてのます。「Firebase Authを使用してアプリにログインしたユーザー」というオプションがある場合は、これを使用します。これは、ユーザーのみにアクセスを制限するためです。
firebaseStorageDownloadTokensを使用して独自のダウンロードURLを作成する
いくつかの回答が、文書化されていないGoogle Storageオブジェクトプロパティについて説明していますfirebaseStorageDownloadTokens
。これにより、使用したいトークンをストレージに伝えることができます。uuid
Nodeモジュールでトークンを生成できます。4行のコードで、独自のダウンロードURLを作成できますgetDownloadURL()
。これは、コンソールまたはから取得したものと同じダウンロードURLです。4行のコードは次のとおりです。
const uuidv4 = require('uuid/v4');
const uuid = uuidv4();
metadata: { firebaseStorageDownloadTokens: uuid }
https://firebasestorage.googleapis.com/v0/b/" + bucket.name + "/o/" + encodeURIComponent('Audio/' + longLanguage + '/' + pronunciation + '/' + word + '.webm') + "?alt=media&token=" + uuid);
コンテキスト内のコードは次のとおりです。
var webmPromise = new Promise(function(resolve, reject) {
var options = {
destination: ('Audio/' + longLanguage + '/' + pronunciation + '/' + word + '.mp3'),
contentType: 'audio/' + audioType,
metadata: {
metadata: {
firebaseStorageDownloadTokens: uuid,
}
}
};
synthesizeParams.accept = 'audio/webm';
var file = bucket.file('Audio/' + longLanguage + '/' + pronunciation + '/' + word + '.webm');
textToSpeech.synthesize(synthesizeParams)
.then(function(audio) {
audio.pipe(file.createWriteStream(options));
})
.then(function() {
resolve("https://firebasestorage.googleapis.com/v0/b/" + bucket.name + "/o/" + encodeURIComponent('Audio/' + longLanguage + '/' + pronunciation + '/' + word + '.webm') + "?alt=media&token=" + uuid);
})
.catch(error => console.error(error));
});
これはタイプミスではありません。firebaseStorageDownloadTokens
二重にネストする必要がありmetadata:
ます。
Doug StevensonさんfirebaseStorageDownloadTokens
は、これは公式のGoogle Cloud Storage機能ではないと指摘しました。あなたはそれをどんなGoogleドキュメンテーションでも見つけません、そしてそれが将来のバージョンのであろうという約束はありません@google-cloud
。firebaseStorageDownloadTokens
それが私が欲しいものを手に入れる唯一の方法であるので私は好きですが、それは使用するのが安全ではないという「匂い」を持っています。
ノードからgetDownloadURL()がないのはなぜですか?
@Clintonが書いたように、Googleはfile.getDownloadURL()
メソッドを作成する必要があり@google-cloud/storage
ます(つまり、ノードのバックエンド)。Google Cloud Functionsからファイルをアップロードし、トークンのダウンロードURLを取得したいと考えています。