Сбой при выполнении любой аутентификации в хранилище Firebase с помощью аутентификации Google

#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');