身份验证在 FirebaseStorage Flutter 中不起作用

Posted

技术标签:

【中文标题】身份验证在 FirebaseStorage Flutter 中不起作用【英文标题】:Auth not working in FirebaseStorage Flutter 【发布时间】:2020-02-09 15:07:07 【问题描述】:

我正在尝试将图片上传到 Flutter 应用中的 Firebase 存储。 我得到的错误信息是用户没有上传权限。在我的存储规则中,权限设置为auth != null 时的读写。 我可以使用下载 url 从存储中加载图像。我还打印出 FirebaseAuth 当前用户并设置它。如果我将 Firebase 存储规则设置为允许所有内容(无需身份验证),它就可以工作。

我需要在某处显式传递身份验证用户吗?身份验证由应用程序中的提供程序包处理。

错误:

E/StorageException(17300):  at com.google.firebase.storage.UploadTask.shouldContinue(com.google.firebase:firebase-storage@@17.0.0:309)
E/StorageException(17300):  at com.google.firebase.storage.UploadTask.run(com.google.firebase:firebase-storage@@17.0.0:226)
E/StorageException(17300):  at com.google.firebase.storage.StorageTask.lambda$getRunnable$7(com.google.firebase:firebase-storage@@17.0.0:1106)
E/StorageException(17300):  at com.google.firebase.storage.StorageTask$$Lambda$10.run(Unknown Source:2)
E/StorageException(17300):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
E/StorageException(17300):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
E/StorageException(17300):  at java.lang.Thread.run(Thread.java:764)
E/StorageException(17300): Caused by: java.io.IOException:   "error":     "code": 403,    "message": "Permission denied. Could not perform this operation"  
E/StorageException(17300):  at com.google.firebase.storage.network.NetworkRequest.parseResponse(com.google.firebase:firebase-storage@@17.0.0:455)
E/StorageException(17300):  at com.google.firebase.storage.network.NetworkRequest.parseErrorResponse(com.google.firebase:firebase-storage@@17.0.0:435)
E/StorageException(17300):  at com.google.firebase.storage.network.NetworkRequest.processResponseStream(com.google.firebase:firebase-storage@@17.0.0:426)
E/StorageException(17300):  at com.google.firebase.storage.network.NetworkRequest.performRequest(com.google.firebase:firebase-storage@@17.0.0:280)
E/StorageException(17300):  at com.google.firebase.storage.network.NetworkRequest.performRequest(com.google.firebase:firebase-storage@@17.0.0:294)
E/StorageException(17300):  at com.google.firebase.storage.UploadTask.send(com.google.firebase:firebase-storage@@17.0.0:470)
E/StorageException(17300):  at com.google.firebase.storage.UploadTask.uploadChunk(com.google.firebase:firebase-storage@@17.0.0:429)
E/StorageException(17300):  at com.google.firebase.storage.UploadTask.run(com.google.firebase:firebase-storage@@17.0.0:225)
E/StorageException(17300):  ... 5 more

代码:

Future<void> changeProfilePicture(File _image, User user) async 
    print(await FirebaseAuth.instance.currentUser());
    final StorageReference _storageReference =
        FirebaseStorage().ref().child(user.id);
    final StorageUploadTask _uploadTask = _storageReference.putFile(_image);
    StorageTaskSnapshot snap = await _uploadTask.onComplete;
    String downloadUrl = await snap.ref.getDownloadURL();
    print(downloadUrl);
    user.setProfilePictureURL(downloadUrl);

    Firestore.instance
        .collection('users')
        .document(user.id)
        .setData(user.toMap());
  

Firebase 存储规则;

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

依赖:

dependencies:
  flutter:
    sdk: flutter
  camera: ^0.5.4+2
  path_provider: ^1.3.0
  path: ^1.6.4
  geolocator: ^5.1.3
  firebase_core: ^0.4.0+9
  firebase_auth: ^0.14.0+5
  cloud_firestore: ^0.12.9+5
  firebase_storage: ^3.0.6
  provider: ^3.1.0
  intl: ^0.16.0

根据 Firebase 错误页面,错误代码是否意味着发件人 ID 与令牌 ID 不同。 我为所有相同的结果尝试了不同的用户帐户。

SENDER_ID_MISMATCH(HTTP 错误代码 = 403)经过身份验证的发件人 ID 与注册令牌的发件人 ID 不同。

【问题讨论】:

【参考方案1】:

尝试改变

 final StorageReference _storageReference = FirebaseStorage().ref().child(user.id);

final StorageReference _storageReference = FirebaseStorage.instance.ref().child(user.id);

【讨论】:

以上是关于身份验证在 FirebaseStorage Flutter 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 存储身份验证

Android 应用程序包上传会在 Firebase 身份验证中创建奇怪的帐户 (<characters>.<5 digits>@gmail.com)

Firebase 存储安全规则不适用于文件夹

FirebaseStorage + Flutter,streamBuilder?

无法在 FirebaseStorage 上上传图片

无法使用 Flutter 将文件上传到 FirebaseStorage