Firebase de repente dejó de funcionar, utilizando Anonymous Auth

He configurado el almacenamiento de firebase para mi aplicación, y agregó el código para la autenticación anónima en la aplicación y en la consola firebase.

funcionó al principio, pero no sé por qué dejó de funcionar, diciendo que el usuario no tiene permiso para acceder al objeto

Anónimo auth está correctamente configurado y lo vi funcionando, el código es casi como Google Firebase docs

logcat:

D / FirebaseAuth: signInAnonymamente: onComplete: true
D / FirebaseAuth: onAuthStateChanged: signed_in: (ID de usuario de autorización aleatoria)

… Cuando solicito el elemento de firebase

E / StorageUtil: error obteniendo el token java.util.concurrent.ExecutionException: com.google.firebase.FirebaseException: Se ha producido un error interno. [Error interno encontrado.] I / DpmTcmClient: RegisterTcmMonitor de: com.android.okhttp.TcmIdleTimerMonitor W / NetworkRequest: no hay token de autorización para la solicitud E / StorageException: StorageException ha ocurrido. El usuario no tiene permiso para acceder a este objeto. Código: -13021 HttpResultado: 403

¿Puede alguien ayudar?

Declaración de variables

private FirebaseAuth mAuth; private FirebaseAuth.AuthStateListener mAuthListener; 

en el método 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(); } // ... } }); 

y el método que sale del almacenamiento:

  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()); } 

también estoy usando reglas de seguridad estándar:

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

El mensaje "W / NetworkRequest: no auth token for request" es la clave para depurar este problema.

Este mensaje de registro significa que Firebase Storage no vio ningún inicio de sesión en el contexto actual. Esto incluye inicios de sesión anónimos. Significa que no se ha pasado ninguna autorización al backend y que la única manera de permitirlo es si las reglas están completamente abiertas (acceso público) que no se recomienda (vea a continuación).

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

Revisaría el código que tiene para iniciar sesión y asegurarse de que se completa correctamente antes de realizar cualquier operación de almacenamiento. Si está seguro de que su código de autenticación es correcto, intente restablecer los datos en el dispositivo para que no haya estado guardado que pueda estropear la información de autorización de la aplicación.

como Benjamin Wulfe insinuó, eliminé los datos de la aplicación en el teléfono y funcionó, lo que significa que algún tipo de datos Token se almacenó en el teléfono y Anonymous Auth estaba recibiendo una vieja sesión de datos.

así que agregué un código de salida antes de firmarAnónimamente

 mAuth.signOut(); 

¡y hecho!

Gracias a todos por la ayuda!

EDIT: He encontrado otro método que es mejor que salir y volver a iniciar (lo que conduce a cientos de usuarios anónimos no utilizados en la consola firebase, y que debido a que la aplicación aún no está en producción, habría sido millones).

Esto es lo que hice:

 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(); } // ... } }); } 

esto acaba de recargar el usuario autenticado actual (anónimo).

Usted puede ser que tenga que comprobar sus REGLAS para el almacenaje en la consola del firebase. Por defecto está configurado para permitir sólo al usuario autenticado sólo como este

  allow read, write: if request.auth != null; 
  • ¿Puedo usar Firebase Storage para la transmisión de música en línea?
  • No se pudo resolver: com.google.firebase: firebase-storage-common: 11.0.1
  • Cómo acortar el período de reintento de descarga de almacenamiento de Firebase en Error de red
  • Android - Firebase - TaskSnapshot - Método sólo debe ser accedido dentro de ámbito privado?
  • Imágenes de caché locales, desde el almacenamiento de firebogs de Google
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.