从Flatter web应用程序发送firebase存储授权作为url参数
我想知道如何使用用户Id令牌作为url中的参数向firebase storage发出授权请求。现在使用firebase规则'request.auth!=null“我收到403网络错误(加载视频失败:您没有访问请求资源的权限)。这是我的GET请求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
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还可能意味着您正试图从其他来源访问它
我建议采取以下方法
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((_) {...