我的应用在颤抖中使用此代码来上传图片:
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获取当前用户,因此该签名似乎运行良好。 那为什么请求失败?
答案 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');