1

我想知道如何使用用户 ID 令牌作为 url 中的参数向 firebase 存储发出授权请求。现在使用“request.auth!= null”的firebase规则,我收到403网络错误(无法加载视频:您无权访问所请求的资源)。这是我的 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=

- 不使用firebase SDK获取文件的原因是我可以使用flutter video_player(https://pub.dev/packages/video_player#-example-tab-)包并将其与firebase中的文件一起使用,我提到这一点,以防现在有更好的方法在 Flutter Web 中使用 video_player 库:

_controller = VideoPlayerController.network(
      'https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4',
      closedCaptionFile: _loadCaptions(),
    );

[编辑] 似乎无法将身份验证作为查询参数传递。经过一番探索,我找到了一种可接受的方式,仍然可以将 video_player 与受保护的 firebase 资产一起使用(如果您不使用规则来保护它们,则可以直接使用 firebase url)。我将在这里发布一些一般步骤和一些示例代码:

使用Storage Firebase SDK包获取Uint8List,getDownloadURL给出的uri有正确的header 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((_) {...

而已。

4

2 回答 2

1

在内部,这个包为 flutter-web 所做的所有事情都是在此处HtmlElementView创建一个小部件,它通过提供的 URL 从包中传递一个(参考此处),该URL 转换为网页中 shadow dom 元素内的标签。错误 403 也可能意味着您正在尝试从不同的来源访问它。VideoElementdart:html<Video>

我建议采用以下方法。

  1. 检查您的控制台是否有任何与 CORS 相关的错误。如果是,那么您将不得不在 Firebase 存储中将您的 ip/域列入白名单。在此处查看此帖子以了解可能的方法和更多详细信息。

  2. 检查您是否能够按照您的建议使用授权令牌作为查询参数直接访问 URL。如果不是,那么它不是访问对象的正确方法,应该更正。您可以使用确切的错误详细信息更新问题。

于 2020-06-24T09:57:34.003 回答
1

Firebase Storage REST 不(正确地)支持来自 GET 查询字符串的授权,就像您尝试做的那样。相反,它使用标准Authorization标头(参见此处)。

Firebase 云存储在内部使用 Google Cloud Storage。这里提到

如果您使用的库还不支持 HTTP 标头,您必须考虑替代方案。您在评论中提到的问题表明该功能仍在开发中,因此您也可以等待库推出对标头的支持。

于 2020-06-24T16:19:07.877 回答