Firebase存储:尽管有公共规则,但不允许用户访问对象

时间:2017-06-18 17:54:10

标签: android firebase firebase-security firebase-storage

我是Firebase存储新手。我制作了一个应该从Firebase下载文件的简单应用程序。 每次下载失败,并出现以下错误:

StorageException: StorageException has occurred.
User does not have permission to access this object.
Code: -13021 HttpResult: 403

这些是我对Firebase的规定:

service firebase.storage {
  match /b/***.appspot.com/o {
    match /{allPaths=**} {
      allow read, write: if true;
    }
  }
}

我已经尝试启用匿名身份验证,但即使登录成功,这也不会改变任何内容。

编辑:这是我的java代码:

FirebaseAuth mAuth;
mAuth = FirebaseAuth.getInstance();
mAuth.signInAnonymously().addOnCompleteListener((Activity) context, new OnCompleteListener<AuthResult>() {...}


FirebaseStorage firebaseStorage = FirebaseStorage.getInstance();
//Create a storage reference from our app
storageRef = firebaseStorage.getReference();
contentDir = new File(context.getFilesDir().getAbsolutePath() + "\\content\\testfile.txt");
storageRef.getFile(contentDir).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {...}

2 个答案:

答案 0 :(得分:2)

<强>更新

不支持从存储根目录下载文件,或者默认安全规则不涵盖这些文件。 (也许match /{allPaths=**}不包含root?)将文件移动到root以外的某个位置:

FirebaseStorage firebaseStorage = FirebaseStorage.getInstance();
storageRef = firebaseStorage.getReference("anyPath");

如果要进行测试,您希望允许公共访问存储桶,请使用从Storage Guide复制的这些规则。 j_h_o_m_o发布的规则更安全,限制了对已登录用户的访问:

// Anyone can read or write to the bucket, even non-users of your app.
service firebase.storage {
  match /b/***.appspot.com/o {
    match /{allPaths=**} {
      allow read, write;
    }
  }
}

同时检查您的存储桶名称是否与您在Firebase控制台中看到的名称相匹配。例如,如果“存储文件”选项卡显示gs://project-12345.appspot.com,则您的规则将启动:

match /b/project-12345.appspot.com/o {

答案 1 :(得分:0)

注意:这将允许任何人访问您的存储是否经过身份验证 尝试将规则更改为存储到此

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