当我尝试从 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 读取和写入,它对于经过身份验证的用户和特定组有更细粒度的规则。
我很确定您的安全规则应该是:
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read, write: if request.auth != null;
}
}
}
按照文档中的这个示例。