我想知道如何使用用户 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((_) {...
而已。