Flutter:使用Google身份验证在Firebase存储中实施任何身份验证失败

时间:2020-10-28 13:05:06

标签: firebase flutter firebase-authentication firebase-storage

我的应用在颤抖中使用此代码来上传图片:

final StorageReference imageRef = FirebaseStorage.instance.ref().child('postimages');
    final StorageUploadTask uploadTask = imageRef.child('/' + currentUser.id + '/post_$postid.jpg').putFile(_image);
    var upurl = await (await uploadTask.onComplete).ref.getDownloadURL();
    url = upurl.toString();
    debugPrint('url:$url');

如果我根据这些不推荐的规则授予完全重写访问权限,这将很好地工作:

rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if true;
    }
  }
}

但是,如果我尝试使用此规则来实现任何安全性:

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

    }
  }
}

我最终遇到以下异常: [VERBOSE-2:ui_dart_state.cc(177)]未处理的异常:PlatformException(错误-13021,FIRStorageErrorDomain,用户无权访问gs://picturegramm.appspot.com/postimages/118190432651181005229/post_b050df01-7b58-4016- 8d3c-28c7f3ace630.jpg。,空)

该应用程序正在使用Firebase身份验证,并以google作为登录提供程序。 阅读文档后,身份验证信息始终会自动发送。 由于我正在使用userid获取当前用户,因此该签名似乎运行良好。 那为什么请求失败?

1 个答案:

答案 0 :(得分:0)

由于Gabe的评论,我发现代码确实有效,但是我的身份验证不完整,因为我没有将登录名传递给firebase。 供以后参考,这是使其正常工作所需的完整登录代码:

  final GoogleSignInAccount googleUser = await GoogleSignIn().signIn();

  // Obtain the auth details from the request
  final GoogleSignInAuthentication googleAuth = await googleUser.authentication;

  // Create a new credential
  final GoogleAuthCredential credential = GoogleAuthProvider.credential(
    accessToken: googleAuth.accessToken,
    idToken: googleAuth.idToken,
  );

  // Once signed in, return the UserCredential
  UserCredential creds = await  FirebaseAuth.instance.signInWithCredential(credential);
  debugPrint('creds:$creds');