Firebase внезапно перестала работать, используя анонимный Auth

Я установил хранилище firebase для своего приложения и добавил код для анонимного авторизации в приложении и на консоли firebase.

Он работал сначала, но я не знаю, почему он прекратил работать, заявив, что у пользователя нет разрешения на доступ к объекту

Анонимный аут правильно настроен, и я видел, как он работает, код почти как документы Google Firebase

LogCat:

D / FirebaseAuth: signInAnonymously: onComplete: true
D / FirebaseAuth: onAuthStateChanged: signed_in: (произвольный идентификатор пользователя auth)

… Когда я запрашиваю элемент из firebase

E / StorageUtil: ошибка получения token java.util.concurrent.ExecutionException: com.google.firebase.FirebaseException: Произошла внутренняя ошибка. [Внутренняя ошибка.] I / DpmTcmClient: RegisterTcmMonitor от: com.android.okhttp.TcmIdleTimerMonitor W / NetworkRequest: нет аутентификационного маркера для запроса E / StorageException: произошло событие StorageException. У пользователя нет разрешения на доступ к этому объекту. Код: -13021 HttpResult: 403

Может кто-то помочь?

Объявление переменных

private FirebaseAuth mAuth; private FirebaseAuth.AuthStateListener mAuthListener; 

По методу OnCreate

 mAuthListener = new FirebaseAuth.AuthStateListener() { @Override public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { FirebaseUser user = firebaseAuth.getCurrentUser(); if (user != null) { // User is signed in Log.d("FirebaseAuth", "onAuthStateChanged:signed_in:" + user.getUid()); } else { // User is signed out Log.d("FirebaseAuth", "onAuthStateChanged:signed_out"); } // ... } }; mAuth.signInAnonymously() .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { Log.d("FirebaseAuth", "signInAnonymously:onComplete:" + task.isSuccessful()); // If sign in fails, display a message to the user. If sign in succeeds // the auth state listener will be notified and logic to handle the // signed in user can be handled in the listener. if (!task.isSuccessful()) { Log.w("FirebaseAuth", "signInAnonymously", task.getException()); Toast.makeText(SingleMemeEditor.this, "Authentication failed.", Toast.LENGTH_SHORT).show(); } // ... } }); 

И метод, который получается из хранилища:

  Bitmap bmp; final Context lContext = context; //getting the MainActivity Context final String lFileName = fileName; //filename to download final String lCatPath = catPath; //internal categorization folder FirebaseStorage storage = FirebaseStorage.getInstance(); // Create a storage reference from our app StorageReference storageRef = storage.getReferenceFromUrl(context.getResources().getString(R.string.firebase_bucket)); // Create a reference with an initial file path and name StorageReference filesRef = storageRef.child("files/" + fileName); try { final File localFile = File.createTempFile("images", "jpg"); filesRef.getFile(localFile).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() { @Override public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) { // Local temp file has been created File file = new File(getDirectory(lContext) + File.separator + lCatPath + File.separator + lFileName); try { Boolean b = file.createNewFile(); if(b) { FileInputStream in = new FileInputStream(localFile); FileOutputStream out = new FileOutputStream(file); // Transfer bytes from in to out byte[] buf = new byte[(int)localFile.length()]; int len; while ((len = in.read(buf)) > 0) { out.write(buf, 0, len); } in.close(); out.close(); } Drawable.createFromPath(file.getPath())).getBitmap()); } catch (IOException ex) { // Handle any errors Log.e("CopyingFromTemp", ex.getMessage()); } } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception ex) { // Handle any errors Log.e("FirebaseDownloadError", ex.getMessage()); } }); } catch(Exception ex) { Log.e("FirebaseDownloadError", ex.getMessage()); } 

Также я использую стандартные правила безопасности:

 match /{allPaths=**} { allow read, write: if request.auth != null; } 

Сообщение «W / NetworkRequest: no auth token для запроса» является ключевым для отладки этой проблемы.

Это сообщение журнала означает, что в Firebase Storage не было входа в текущий контекст. Это включает анонимные логины. Это означает, что никакая авторизация не была передана на бэкэнд, и единственный способ, которым это будет разрешено, – это установить, что ваши правила полностью открыты (открытый доступ), который не рекомендуется (см. Ниже).

  //this sets completely open access to your data allow read, write; 

Я бы рассмотрел код, который у вас есть для входа в систему, и убедитесь, что он успешно завершен до того, как будет выполнена любая операция хранения. Если вы уверены, что ваш код аутентификации верен, попробуйте сбросить данные на устройстве, чтобы не было сохраненного состояния, чтобы испортить информацию об авторизации приложения.

Как намекнул Бенджамин Вульф, я удалил данные приложения по телефону, и это сработало, а это значит, что на телефоне были сохранены какие-то данные токена, а анонимный Аут получал старые данные сеанса.

Поэтому я добавил код выхода до signInAnonymously

 mAuth.signOut(); 

И сделал!

Спасибо вам всем за помощь!

EDIT: Я нашел другой метод, который лучше, чем выходить из системы и снова (что приводит к сотням неиспользуемых анонимных пользователей на консоли firebase, и это потому, что приложение еще не в производстве, было бы миллионы).

Это то, что я сделал:

 if (mAuth.getCurrentUser() != null) { mAuth.getCurrentUser().reload(); } else { mAuth.signInAnonymously() .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { Log.d("FirebaseAuth", "signInAnonymously:onComplete:" + task.isSuccessful()); // If sign in fails, display a message to the user. If sign in succeeds // the auth state listener will be notified and logic to handle the // signed in user can be handled in the listener. if (!task.isSuccessful()) { Log.w("FirebaseAuth", "signInAnonymously", task.getException()); Toast.makeText(MainActivity.this, "Authentication failed.", Toast.LENGTH_SHORT).show(); } // ... } }); } 

Это просто перезагружает текущий аутентифицированный (анонимный) пользователь.

Возможно, вам придется проверить свои ПРАВИЛА для хранения в консоли firebase. По умолчанию установлено, что разрешено только для аутентифицированного пользователя только так

  allow read, write: if request.auth != null;