TLDR: Это вопрос об URL-адресе, возвращенном из task.snapshot.ref.getDownloadURL()
и соответствующем downloadToken
.Он спрашивает о том, какова основная роль и функциональность token
, и нужно ли это для файлов, которые будут общедоступны по правилам безопасности.
Я только что закончил руководства по загрузке изагрузка файлов в хранилище Firebase, найденное на https://firebase.google.com/docs/storage/web/upload-files, а также на этом руководстве по YouTube с официального канала Firebase .
Я строюСистема управления контентом для раздела блога в одном из моих веб-приложений Firebase (React + Firebase).
У меня есть компонент, который позволяет администратору выбрать изображение и загрузить его в корзину хранения Firebase для отображения вконкретное сообщение в блоге.Все изображения для определенного blogPost
должны находиться в папке для определенного blog-post-slug
.
Пример:
//bucket/some-blog-post-slug/image1.jpg
Код, который запускается всякий раз, когда администратор выбирает новый файлна <input type='file'/>
:
function onFileSelect(e) {
const file = e.target.files[0];
const storageRef = firebase.storage().ref('some-slug/' + file.name);
const task = storageRef.put(file);
task.on('state_changed',
function progress(snapshot) {
setPercent((snapshot.bytesTransferred / snapshot.totalBytes) * 100);
},
function error(err) {
console.log(err);
},
function complete() {
console.log('Upload complete!');
task.snapshot.ref.getDownloadURL().then(function(downloadURL) {
console.log('File available at', downloadURL);
props.changeImageSrc(downloadURL);
});
}
);
}
Приведенный выше код возвращает downloadURL
, который будет сохранен в Firestore в документе blogPost
.
* downloadURL
имеет следующий формат:
https://firebasestorage.googleapis.com/v0/b/MYFIREBASEAPP.appspot.com/o/some-slug%2FILE_NAME.jpg?alt=media&token=TOKEN_VALUE
Вы можете видеть, что он поставляется с «базовым URL»: https://firebasestorage.googleapis.com/v0/b/MYFIREBASEAPP.appspot.com/o/some-slug%2FILE_NAME.jpg
И basicURL сопровождается следующими параметрами GET:
alt=media
и token=TOKEN_VALUE
Я не знал, что получу токен, поэтому ятеперь проверяем его поведение, чтобы узнать о нем больше.
ПОВЕДЕНИЕ С РАЗДЕЛАМИ ХРАНИЛИЩА:
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read, write;
}}}
- Когда я получаю доступ кbasicURL:
- Я получаю объект в ответ с данными загруженного файла:
{
"name": "some-slug/FILE_NAME.jpg",
"bucket": "MYBUCKET",
"generation": "GENERATION_NUMBER",
"metageneration": "1",
"contentType": "image/jpeg",
"timeCreated": "2019-06-05T13:53:57.070Z",
"updated": "2019-06-05T13:53:57.070Z",
"storageClass": "STANDARD",
"size": "815155",
"md5Hash": "Mj4aCPs21NUNxXpKg1bHirFIO0A==",
"contentEncoding": "identity",
"contentDisposition": "inline; filename*=utf-8''FILE_NAME.jpg",
"crc32c": "zhkQMQ==",
"etag": "CKu4a1+u2+0ucI412CEAE=",
"downloadTokens": "TOKEN_VALUE"
}
ПОВЕДЕНИЕ С ЗАПИСЬЮ ХРАНИЛИЩА ОГРАНИЧЕНО:
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read, write: if request.auth != null;
}}}
- Когда я получаю доступ к basicURL:
- Я получаю следующий объект ошибки:
{
"error": {
"code": 403,
"message": "Permission denied. Could not perform this operation"
}
}
- Когда я получаю доступ к basicURL? Alt = media
- Я получаютот же объект ошибки:
{
"error": {
"code": 403,
"message": "Permission denied. Could not perform this operation"
}
}
- Когда я получаю доступ к basicURL? alt = media & token = TOKEN_VALUE
- Изображение отображается.
ЗАКЛЮЧЕНИЕ И ВОПРОСЫ
Мне кажется, что правило безопасности allow read: if request.auth != null;
должно было блокировать любые чтения от неавторизованных пользователей, но с TOKEN
параметр, файл доступен даже для запросов без объекта auth
(Примечание: я не вошел в систему, когда выполнял тесты, описанные выше).
Я знаю, что не рекомендуется задавать больше вопросовn 1 вопрос, но в данном случае я думаю, что это необходимо:
ВОПРОС 1:
Для чего в основном используется этот токен и почему он переопределил auth
править?
ВОПРОС 2:
Я хочу, чтобы эти изображения были общедоступными, так как раздел блога будет для всех пользователей.Какой URL я должен сохранить в Firestore?
ВОПРОС 3:
Toотображать изображения в тегах <image src="imgSrc">
мне нужен параметр alt=media
?Или окончание basicURL в FILE_NAME достаточно хорошо?
РЕДАКТИРОВАТЬ: ВОПРОС 3 ОТВЕТ: Просто проверил его и обнаружил, что параметр alt=media
GET необходим для отображения изображения внутри<img>
tag.
ПРИМЕЧАНИЕ: если вы загрузите один и тот же файл и замените старый, каждый раз вы будете получать token
разное, а старшее token
становится недействительным.