6

認証でデータベースの読み取りと書き込みを行いたいが、私はPermission deniedを持っている。私はなぜそれが動作していないか把握しようとしています。Firebase認証での拒否(読み取りと書き込み)

ドキュメントで説明されているように、認証が必要なのでデフォルトルールを使用しました。

デフォルトルールには認証が必要です。彼らは、あなたのアプリの認証されたユーザーに完全な読み書きアクセスを許可します。データをアプリのすべてのユーザーに公開したいが、世界中に公開したくない場合に便利です。

  • Firebaseルール:ユーザーに

    auth.createUserWithEmailAndPassword(email, password) 
         .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { 
          @Override 
          public void onComplete(@NonNull Task<AuthResult> task) { 
           Log.d("USER_CREATE", "createUserWithEmail: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()) { 
            Toast.makeText(getApplicationContext(), "Authentication failed.", 
              Toast.LENGTH_SHORT).show(); 
           } else { 
            startActivity(new Intent(SignupActivity.this, MainActivity.class)); 
            finish(); 
           } 
    
           // ... 
          } 
         }); 
    
  • 星座::

    { 
        "rules": { 
        ".read": "auth != null", 
        ".write": "auth != null" 
        } 
    } 
    
  • ユーザーを作成します

    auth.signInWithEmailAndPassword(email, password) 
         .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { 
          @Override 
          public void onComplete(@NonNull Task<AuthResult> task) { 
           Log.d("COMPLETE", "signInWithEmail:onComplete:" + task.isSuccessful()); 
          } 
         }); 
    

私はAuthListenerを持って、それはユーザーが署名されていることを私に記録します

  • AuthListener:

    mAuthListener = new FirebaseAuth.AuthStateListener() { 
         @Override 
         public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 
          FirebaseUser user = firebaseAuth.getCurrentUser(); 
          if (user != null) { 
           // User is signed in 
           Log.d("TAG", "onAuthStateChanged:signed_in:" + user.getUid()); 
          } else { 
           // User is signed out 
           Log.d("TAG", "onAuthStateChanged:signed_out"); 
          } 
          // ... 
         } 
        }; 
        // ... 
    
  • 読む試験:(とデータベースに手動で追加したノード)

    firebase.child("test").addValueEventListener(new ValueEventListener() { 
    
        @Override 
        public void onDataChange(DataSnapshot snapshot) { 
         Log.d("result", snapshot.getValue()+""); 
        } 
    
        @Override 
        public void onCancelled(FirebaseError error) { 
         Log.d("The read failed: ", error.getMessage()); 
        } 
    }); 
    
  • 書き込みテストdevsemployers:私は、ユーザーの二つのカテゴリーでメインノードusersをしたいです。

    Firebase usersRef = firebase.child("users").child("devs"); 
        FirebaseUser user = auth.getCurrentUser(); 
    
    Map<String, String> userMap = new HashMap<String, String>(); 
    userMap.put("name", "blabla"); 
    userMap.put("city", "Brussels"); 
    
    Map<String, Map<String, String>> users = new HashMap<String, Map<String, String>>(); 
    users.put(user.getUid().toString(), userMap); 
    usersRef.setValue(users); 
    
  • ログ:

    D/AUTH LISTENER: onAuthStateChanged:signed_in:wnomkwiOWOb4wNNLSsrWeT5xxUq1 
    D/USER_CREATE: createUserWithEmail:onComplete:true 
    I/AppCompatViewInflater: app:theme is now deprecated. Please move to using android:theme instead. 
    D/ACTION BAR?: [email protected] 
    W/SyncTree: Listen at /test failed: FirebaseError: Permission denied 
    D/The read failed:: Permission denied 
    D/FirebaseAuth: Notifying listeners about user (wnomkwiOWOb4wNNLSsrWeT5xxUq1). 
    D/FirebaseAuth: Notifying listeners about user (wnomkwiOWOb4wNNLSsrWeT5xxUq1). 
    D/FirebaseApp: Notifying auth state listeners. 
    D/FirebaseApp: Notified 0 auth state listeners. 
    D/AUTH LISTENER: onAuthStateChanged:signed_in:wnomkwiOWOb4wNNLSsrWeT5xxUq1 
    D/FirebaseApp: Notifying auth state listeners. 
    D/FirebaseApp: Notified 0 auth state listeners. 
    D/AUTH LISTENER: onAuthStateChanged:signed_in:wnomkwiOWOb4wNNLSsrWeT5xxUq1 
    D/COMPLETE: signInWithEmail:onComplete:true 
    

私は公共の許可を得て、これらの2つのテストを行った(書き込み:真、読み:真)と、それは働いていたので、何かがと間違っている必要があります私の認証。私はおそらく誤解している/何かを見逃しているが、本当に正確に何かを見ていない。誰かが私を啓発したい場合は非常にいいだろう!

+0

Firebaseコンソールに登録されているユーザと権限タブのスクリーンショットを共有できますか? –

+0

ルールを[シミュレータ](http://stackoverflow.com/a/37911209/4695325)でテストしましたか?さらなる助けが必要な場合は、ここに結果を掲載することができます。 また、あなたのログからは、あなたのアプリケーションが起動するたびに 'createUserWithEmailAndPassword'と' signInWithEmailAndPassword'が呼び出されているようです。ユーザが既にログインしているかどうかを検出するには 'onAuthStateChanged'を使うべきです。もし彼がすでに登録されていてログインしたいのであれば、" account "または" signInWithEmailAndPassword "を作成する必要があるなら' createUserWithEmailAndPassword'を使用してください。 –

+0

@DevidFarinelli I (私のアプリでは私は電子メール/パスワード認証を使用しているので) 'カスタム'認証を使用してシミュレータでルールをテストしたところ、両方に対してうまく機能するので、問題は認証プロセスにあると仮定します。このコードはSignupActivityに由来しているので、毎回ユーザーを作成して署名しています。 – raphh

答えて

2

古いFirebase SDKと新しいFirebase SDKを混在させています。 build.gradleからfirebase-android-sdk 2.5.2を削除し、Firebaseクラスの代わりに新しいDatabaseReferenceクラスを使用するようにインポートを更新してください。

関連する問題