이 답변은 Google / Firebase Cloud Storage에 파일을 업로드 할 때 다운로드 URL을 가져 오는 옵션을 요약합니다. 다운로드 URL에는 세 가지 유형이 있습니다.
- 임시적이고 보안 기능이있는 서명 된 다운로드 URL
- 영구적이고 보안 기능이있는 토큰 다운로드 URL
- 영구적이고 보안이 부족한 공개 다운로드 URL
토큰 다운로드 URL을 얻는 방법에는 세 가지가 있습니다. 다른 두 개의 다운로드 URL에는이를 가져올 수있는 방법이 하나뿐입니다.
Firebase 저장소 콘솔에서
Firebase 저장소 콘솔에서 다운로드 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 저장소 콘솔에서 얻을 수있는 것과 동일한 다운로드 URL을 가져옵니다. 이 방법은 쉽지만 비교적 간단한 데이터베이스 구조를 위해 내 앱에서 약 300 줄의 코드 인 파일 경로를 알고 있어야합니다. 데이터베이스가 복잡하다면 악몽이 될 것입니다. 프런트 엔드에서 파일을 업로드 할 수 있지만이 경우 앱을 다운로드하는 모든 사람에게 자격 증명이 노출됩니다. 따라서 대부분의 프로젝트에서 노드 백엔드 또는 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 일입니다.
여기서 getSignedUrl 은 서명 된 URL이 1 주일 후에 만료된다는 사실을 결코 말하지 않는다는 사실을 폭언 할 것입니다. 문서 코드에는 3-17-2025
만료 날짜가 있으므로 향후 만료 연도를 설정할 수 있음을 나타냅니다. 내 앱은 완벽하게 작동했지만 일주일 후 충돌했습니다. 오류 메시지는 다운로드 URL이 만료 된 것이 아니라 서명이 일치하지 않는다는 내용입니다. 나는 내 코드를 다양하게 변경했고 모든 것이 작동했다. 이것은 한 달이 넘는 좌절감 동안 계속되었습니다.
파일을 공개적으로 사용 가능하게 만들기
문서에 설명 된대로 파일에 대한 권한을 공개 읽기로 설정할 수 있습니다 . 이는 Cloud Storage 브라우저 또는 노드 서버에서 수행 할 수 있습니다. 하나의 파일을 공개하거나 디렉토리 또는 전체 스토리지 데이터베이스를 만들 수 있습니다. 다음은 노드 코드입니다.
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
파일을 공개하는 또 다른 방법은 makePublic () 메서드를 사용하는 것 입니다. 이 작업을 수행 할 수 없었고 버킷 및 파일 경로를 올바르게 지정하는 것이 까다 롭습니다.
흥미로운 대안은 액세스 제어 목록 을 사용하는 것 입니다. 목록에 추가 한 사용자 만 파일을 사용할 수 있도록하거나 authenticatedRead
Google 계정으로 로그인 한 모든 사용자가 파일을 사용할 수 있도록하는 데 사용할 수 있습니다. "Firebase Auth를 사용하여 내 앱에 로그인 한 모든 사람"옵션이있는 경우이 옵션을 사용하면 내 사용자에게만 액세스 권한이 제한됩니다.
firebaseStorageDownloadTokens로 나만의 다운로드 URL 구축
문서화되지 않은 Google Storage 객체 속성에 대한 몇 가지 답변이 있습니다 firebaseStorageDownloadTokens
. 이를 통해 사용하려는 토큰을 Storage에 알릴 수 있습니다. uuid
Node 모듈 로 토큰을 생성 할 수 있습니다 . 네 줄의 코드를 사용하면 콘솔 또는 .NET에서 가져온 것과 동일한 다운로드 URL 인 고유 한 다운로드 URL을 만들 수 있습니다 getDownloadURL()
. 네 줄의 코드는 다음과 같습니다.
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
것을 얻을 수있는 유일한 방법이기 때문에 좋아 하지만 사용하기에 안전하지 않다는 "냄새"가 있습니다.
Node에 getDownloadURL ()이없는 이유는 무엇입니까?
@Clinton이 썼 듯이 Google은 (즉, 노드 백엔드) file.getDownloadURL()
에서 메소드를 만들어야합니다 @google-cloud/storage
. Google Cloud Functions에서 파일을 업로드하고 토큰 다운로드 URL을 받고 싶습니다.