web-dev-qa-db-fra.com

Android Erreur de base de données Firebase: autorisation refusée

Je travaille sur un projet Android qui nécessite une authentification e-mail et pwd de l'utilisateur. Les détails sont stockés dans la base de données firebase. Le problème se produit chaque fois que je tente de me reconnecter avec l'e-mail et le mot de passe. Dans mon logcat le message d'erreur est:

W/SyncTree: Listen at / failed: DatabaseError: Permission denied

Jetez un œil à mon code ci-dessous:

public class LoginUser extends AppCompatActivity {

private RelativeLayout relativeLayout;

private EditText et_email, et_password;
private Button loginBtn;

private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener authStateListener;
private DatabaseReference databaseReference;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login_user);

    mAuth = FirebaseAuth.getInstance();
    databaseReference = FirebaseDatabase.getInstance().getReference();
    databaseReference.keepSynced(true);

    relativeLayout = (RelativeLayout) findViewById(R.id.activity_login_user);

    et_email = (EditText) findViewById(R.id.emailField);
    et_password = (EditText) findViewById(R.id.pwdField);
    loginBtn = (Button) findViewById(R.id.loginBtn);

    loginBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            initLogin();
        }
    });

    authStateListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            if (firebaseAuth.getCurrentUser() != null){
                initLogin();
            }
            else {
                startActivity(new Intent(LoginUser.this,RegisterFireBase.class));
            }
        }
    };

}

@Override
protected void onStart() {
    super.onStart();
    mAuth.addAuthStateListener(authStateListener);
}

@Override
protected void onStop() {
    super.onStop();
    if (mAuth != null){
        mAuth.removeAuthStateListener(authStateListener);
    }
}

private void initLogin() {

    String email = et_email.getText().toString().trim();
    String pass = et_password.getText().toString().trim();

    if (!TextUtils.isEmpty(email) && !TextUtils.isEmpty(pass)){
        mAuth.signInWithEmailAndPassword(email,pass).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {

                checkForUser();

            }
        });
    }
    else {
        Toast.makeText(this, "Some fields are empty", Toast.LENGTH_SHORT).show();
    }

}

private void checkForUser() {

    final String userId = mAuth.getCurrentUser().getUid();
    databaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.hasChild(userId)){

                Intent loginIntent =  new Intent(LoginUser.this, FireProfile.class);
                loginIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(loginIntent);

                Snackbar.make(relativeLayout,"Log In Successful",Snackbar.LENGTH_LONG).show();

            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

}

Qu'est-ce qui peut causer cela?

10
Nzadibe

La raison pourrait être: vous n'avez pas accès en lecture et en écriture à votre base de données. Pour activer l'accès en lecture et en écriture:

Accédez à la console Firebase et activez les opérations de lecture et d'écriture sur votre base de données.

Firebase Console -> Database (develop) -> RULES

{
  "rules": {
    ".read": "true",
    ".write": "true"
  }
}
11
abhishesh

Accédez à l'onglet Règles de votre console de base de données. Si vous n'avez pas explicitement accordé l'accès .read à votre utilisateur, l'autorisation sera refusée.

Ce lien est excellent dans la doc Firebase:

https://firebase.google.com/docs/database/security/securing-data

Ces deux notes sur cette page sont d'un intérêt particulier:

Remarque: l'accès est interdit par défaut. Si aucune règle .write ou .read n'est spécifiée au niveau ou au-dessus d'un chemin, l'accès sera refusé.

Remarque: les règles de sécurité moins profondes remplacent les règles sur les chemins plus profonds. Les règles enfant peuvent uniquement accorder des privilèges supplémentaires aux nœuds parents déjà déclarés. Ils ne peuvent pas révoquer un privilège de lecture ou d'écriture.

Passez en revue le nœud où l'autorisation est refusée et utilisez le simulateur dans l'onglet Règles afin de tester vos règles pour différents contextes de sécurité des utilisateurs (non authentifiés, authentifiés, etc.)

9
Lucy

Ne mettez pas votre application publique si cela n'est pas nécessaire. Comme décrit dans la documentation Google, vous pouvez appliquer ces règles sur votre base de données> base de données> règles

// These rules grant access to a node matching the authenticated
// user's ID from the Firebase auth token
{
  "rules": {
    "users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      }
    }
  }
}

ou pour ne laisser que des utilisateurs authentifiés

// These rules require authentication
    {
      "rules": {
        ".read": "auth != null",
        ".write": "auth != null"
      }
    }

Laisser une application publique laisser quiconque écrire et lire votre application ... je ne pense pas qu'une application devrait utiliser ceci comme ça.

7
mcfly

Faites quelques changements sur la base de données Firebase.

  1. allez dans firebase -> Base de données -> règles

screenshot

{
  "rules": 
{
    ".read": true,
    ".write": true
  }

}
7
HandyPawan