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?
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"
}
}
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.)
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.
Faites quelques changements sur la base de données Firebase.
{
"rules":
{
".read": true,
".write": true
}
}