从Flatter web应用程序发送firebase存储授权作为url参数

从Flatter web应用程序发送firebase存储授权作为url参数,firebase,flutter,firebase-authentication,flutter-web,flutter-video-player,Firebase,Flutter,Firebase Authentication,Flutter Web,Flutter Video Player,我想知道如何使用用户Id令牌作为url中的参数向firebase storage发出授权请求。现在使用firebase规则'request.auth!=null“我收到403网络错误(加载视频失败:您没有访问请求资源的权限)。这是我的GET请求url: https://firebasestorage.googleapis.com/v0/b/<bucket>/o/<folder_name>%2F<video_name>.mp4?alt=media&aut

我想知道如何使用用户Id令牌作为url中的参数向firebase storage发出授权请求。现在使用firebase规则'request.auth!=null“我收到403网络错误(加载视频失败:您没有访问请求资源的权限)。这是我的GET请求url:

https://firebasestorage.googleapis.com/v0/b/<bucket>/o/<folder_name>%2F<video_name>.mp4?alt=media&auth=eyJh...<ID TOKEN>...Ll2un8ng 
[编辑]似乎无法将身份验证作为查询参数传入。经过一番探索,我找到了一种可以接受的方法,可以将视频播放器与受保护的firebase资产一起使用(如果您没有使用规则来保护它们,则可以直接使用firebase url)。我将在这里发布一些一般步骤和一些示例代码:

使用存储Firebase SDK包获取Uint8List,例如,getDownloadURL提供的uri具有正确的头验证

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,该ObjectURL基本上为您提供与文件url相同的接口,以用作视频播放器的网络url

final blob = html.Blob([data.buffer], 'video/mp4');
final videoUrl = html.Url.createObjectUrl(blob);
videoPlayerController = VideoPlayerController.network(
          videoUrl)
        ..initialize().then((_) {...

就是这样。

在内部,这个包为Flatter web所做的所有工作就是创建一个
HtmlElementView
小部件,它通过包
dart:html
中的
VideoElement
(ref)传递一个
VideoElement
,并提供URL,该URL转换为网页中阴影dom元素内的
标记。错误403还可能意味着您正试图从其他来源访问它

我建议采取以下方法

  • 检查控制台是否存在任何与CORS相关的错误。如果是,则您必须在firebase存储中将您的ip/域列入白名单。检查此项以了解可能的方法和更多详细信息

  • 检查您是否能够按照建议使用授权令牌作为查询参数直接访问URL。如果不是,则这不是访问对象的正确方式,应予以纠正。您可以使用准确的错误详细信息更新问题


  • Firebase Storage REST不(正确地)支持您尝试从GET查询字符串进行授权。相反,它使用标准的
    authority
    header(请参见)

    Firebase云存储在内部使用Google云存储


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

    在URL中包含身份验证令牌或id令牌确实是个坏主意。我建议您通过
    授权
    标题或帖子正文发送id令牌。视频播放器包不支持标题(),请查看其他选项。感谢您的输入。Firebase存储显然不支持通过url中的GET查询字符串进行授权。您必须以某种方式传递标题(可能使用其他软件包/库)(是的,Firebase storage在引擎盖下使用Google Cloud storage,因此此链接是有效的引用)它不是Cors,而是权限错误。我可以像这样使用firebase sdk访问url(最终url=await firebasePath.child(文件名).getDownloadURL();最终响应=await http.get(url);),但视频播放器的值为1。档案,2。NetworkUrl(不接受标题)或3。资产。并且不接受原始数据(如UInt8List),这使得在这种情况下很难使用firebase sdk。我想接下来我将研究使用Indexeddb和ObjectURL,并研究我的选项。谢谢你对VideoElement的评论,这很有帮助!这似乎是正确的,Firebase存储不支持通过查询字符串进行身份验证,如果有人遇到这种情况,并且有办法做到这一点,请纠正我。我确实找到了一个有趣的解决方案,可以继续使用video_player软件包,我将把它作为问题的编辑发布。然而,这个软件包确实是一个正在进行的工作,所以请注意这篇文章的日期,如果事情发生变化,我会尝试在这里发布更新。
    final blob = html.Blob([data.buffer], 'video/mp4');
    final videoUrl = html.Url.createObjectUrl(blob);
    videoPlayerController = VideoPlayerController.network(
              videoUrl)
            ..initialize().then((_) {...