Отправить авторизацию хранилища firebase как параметр url из веб-приложения flutter
Я хотел бы знать, как сделать авторизованный запрос к хранилищу firebase, используя токен идентификатора пользователя в качестве параметра в URL-адресе. Прямо сейчас с правилом firebase 'request.auth!= Null' я получаю сетевую ошибку 403 (Не удалось загрузить видео: у вас нет разрешения на доступ к запрошенному ресурсу). Вот мой URL-адрес запроса GET:
https://firebasestorage.googleapis.com/v0/b/<bucket>/o/<folder_name>%2F<video_name>.mp4?alt=media&auth=eyJh...<ID TOKEN>...Ll2un8ng
-БЕЗ правила firebase я могу успешно получить актив с этим URL-адресом запроса https://firebasestorage.googleapis.com/v0/b/<bucket>/o/<folder_name>%2F<video_name>.mp4?alt=media
-также пробовал token=, token_id=, tokenId=
-причина, по которой я не использую SDK firebase для получения файла, заключается в том, что я могу использовать пакет flutter video_player (https://pub.dev/packages/video_player) и использовать его с файлами в firebase, Я упоминаю об этом на случай, если сейчас есть лучший способ использовать библиотеку video_player во флаттер-сети:
_controller = VideoPlayerController.network(
'https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4',
closedCaptionFile: _loadCaptions(),
);
[EDIT] Похоже, что невозможно передать аутентификацию в качестве параметра запроса. После некоторого изучения я нашел приемлемый способ по-прежнему использовать video_player с вашими защищенными активами firebase (если вы не используете правила для их защиты, вы можете напрямую использовать URL-адрес firebase). Я опубликую здесь несколько общих шагов и пример кода:
Используйте пакет Storage Firebase SDK, чтобы получить Uint8List, uri, предоставленный getDownloadURL, имеет правильный заголовок auth, например
import 'package:firebase/firebase.dart';
final url = await storagePath.getDownloadURL();
final response = await http.get(url);
if (response.statusCode == 200) {
return response.bodyBytes;
}
используйте буфер Uint8List для инициализации объекта Blob, который вы будете использовать для создания ObjectURL, который в основном дает вам тот же интерфейс, что и URL-адрес файла, который можно использовать в качестве сетевого URL-адреса для вашего видеоплеера.
final blob = html.Blob([data.buffer], 'video/mp4');
final videoUrl = html.Url.createObjectUrl(blob);
videoPlayerController = VideoPlayerController.network(
videoUrl)
..initialize().then((_) {...
Вот и все.
2 ответа
Firebase Storage REST (справедливо) не поддерживает авторизацию из строки запроса GET, как вы пытаетесь это сделать. Вместо этого он использует стандартныйAuthorization
заголовок (см. здесь).
Облачное хранилище Firebase внутри использует Google Cloud Storage. Упоминается здесь
Если используемая вами библиотека еще не поддерживает заголовки HTTP, вы должны рассмотреть альтернативу. Проблема, о которой вы упомянули в комментарии, показывает, что функция все еще находится в стадии разработки, поэтому вы также можете дождаться, когда библиотека выйдет с поддержкой заголовков.
Внутренне все, что этот пакет делает для flutter-web, - это создание HtmlElementView
виджет здесь, для которых она пропускаетVideoElement
(см. здесь) из пакетаdart:html
с предоставленным URL-адресом, который переводится как <Video>
внутри элемента shadow dom на вашей веб-странице. Ошибка 403 также может означать, что вы пытаетесь получить к нему доступ из другого источника.
Я бы предложил следующий подход.
Проверьте свою консоль на наличие ошибок, связанных с CORS. Если да, то вам придется внести свой ip/ домен в белый список в хранилище firebase. Проверьте этот пост для возможного подхода и более подробной информации здесь.
Проверьте, можете ли вы получить доступ к URL-адресу напрямую с токеном авторизации в качестве параметра запроса, как вы предложили. Если нет, то это неправильный способ доступа к объекту, и его следует исправить. Вы можете обновить вопрос, указав точные сведения об ошибке.