#firebase #flutter #firebase-authentication #firebase-storage
#firebase #сбой #firebase-аутентификация #firebase-хранилище
Вопрос:
мое приложение использует этот код в flutter для загрузки изображений:
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 в качестве поставщика входа. При чтении документов похоже, что информация об аутентификации всегда отправляется автоматически. Подписание, похоже, работает отлично, поскольку я получаю текущего пользователя с идентификатором пользователя. Итак, почему запросы не выполняются?
Комментарии:
1. Вы уверены, что пользователь вошел в систему с помощью Google. Если пользователь вышел из системы, это не сработает. Они должны быть авторизованы.
2. Есть идеи, как я проверяю это перед загрузкой? Кажется, что логин работает, так как я получаю, например, адрес электронной почты, идентификатор и фотографию профиля.
3.Проверка, существует ли пользователь
final user = FirebaseAuth.instance.currentUser;
user
, будет равна нулю, если пользователь не вошел в систему.4. ty! значение равно нулю. теперь я должен выяснить, почему это так, после завершения подписания
5. Теперь, по крайней мере, вы сузили проблему. Я предполагаю, что у вас есть какая-то ошибка где-то в вашей логике входа.
Ответ №1:
благодаря комментариям Гейба я узнал, что код действительно действителен, но моя аутентификация была неполной, поскольку я не передавал логин в 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');