经过身份验证后,Flutter 无法读取 Firebase 存储

问题描述 投票:0回答:1

当我尝试从 Firebase.Storage 读取数据时,我有一个 Flutter 应用程序抛出 403 Permission Denied 错误。

我正在加载应用程序时初始化我的 Firebase 应用程序:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp(
    options: DefaultFirebaseOptions.currentPlatform,
  );
 
  await FirebaseAppCheck.instance.activate(
    webProvider: ReCaptchaV3Provider('<REDACTED>'),
    androidProvider:  kDebugMode ? AndroidProvider.debug : AndroidProvider.playIntegrity,
    appleProvider: AppleProvider.appAttest,
  );

这是从存储桶中读取图像的代码:

Future<String> getGroupIconUrl(String? icon) async {
    final storageRef = FirebaseStorage.instance.refFromURL('gs://group_icons/${icon}.png');
    final downloadUrl = await storageRef.getDownloadURL();
    return downloadUrl;     
  }

这是我的存储规则

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
       allow read, write: if auth != null;
    }
  }
}

如果我将 Firestore.Storage 规则更改为

,我可以加载图像
    allow read, write: if true;
   

一旦设置为检查身份验证,我就会收到 403。为了确保 Firebase Auth 不存在某种竞争条件,我在 getGroupIconUrl 方法中设置了一个断点,并确认用户在调用之前已通过身份验证。

当我设置断点时,我可以检查 storageRef 变量,它指向正确的存储桶并且

我当前没有应用程序检查来强制执行存储。

我能够从 Firestore 读取和写入,它对于经过身份验证的用户和特定组有更细粒度的规则。

flutter firebase firebase-storage
1个回答
0
投票

我很确定您的安全规则应该是:

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
       allow read, write: if request.auth != null;
    }
  }
}

按照文档中的这个示例

© www.soinside.com 2019 - 2024. All rights reserved.