0

Firebase Realtime Databaseのルールに問題があります。私はmAuth.createUserWithEmailAndPassword(email, password)と新しいユーザーを登録します。 onCompleteMethodでは、自分自身のユーザーオブジェクトをリアルタイムデータベースに追加したいと考えています。 私はこれをやっています。なぜなら、各ユーザは電子メール/パスワードに関する追加情報を持っているからです。Firebase Realtime Databaseのルールにより、認証されたユーザからの書き込みが許可されない

私は

FirebaseUser fireUser = FirebaseAuth.getInstance().getCurrentUser(); 
if(fireUser == null) { 
    //do something 
} else { 
    createNewUser(fireUser); 
} 

を確認した後、方法

private void createNewUser(FirebaseUser fireUser) { 
     // Build the user-object. 
     User user = new User(); 
     user.setUserId(fireUser.getUid()); 
     user.setUsername(name); 
     user.setSex(sex); 
     user.setEmail(email); 
     user.setAge(time); 
     user.setImageUri(""); 

     // Create database connection and reference. 
     DatabaseReference mDatabaseRef = FirebaseDatabase.getInstance().getReference(); 
     mDatabaseRef.child("users").child(fireUser.getUid()).setValue(user); 
    } 

が呼び出されます。しかし、いくつかの理由でこのDatabaseErrorがスローされます。

W/RepoOperation: setValue at /users/9i6loj4BlCWkgkXOULWxbCSlvnx1 failed: DatabaseError: Permission denied 

FirebaseUserがnullでない場合、私の理解によると - 彼がログインしているので、私のルールは

{ 
    "rules": { 
    ".read": "auth != null", 
    ".write": "auth != null" 
    } 
} 

は、ユーザーが許可されますFirebaseで宣言されましたデータベースに書き込む。しかし、このコードは、ルールを".read": "true"".write": "true"に変更すると機能します。

私の質問は、ここで間違っていますか?私は、認証されたユーザーに読み書きをしたいだけです。

ありがとうございました!

EDIT

@Override 
public void onComplete(@NonNull Task<AuthResult> task) { 
    if (!task.isSuccessful()) { 
     loadingPanel.setVisibility(View.GONE); 
    } else { 
     loadingPanel.setVisibility(View.GONE); 
     FirebaseUser fireUser = FirebaseAuth.getInstance().getCurrentUser(); 
     if(fireUser == null) { 
      Toast.makeText(getApplicationContext(), "User is null", Toast.LENGTH_SHORT).show(); 
     } 

     // Send verification mail 
     sendVerificationEmail(fireUser); 

     // Create a new User! 
     createNewUser(fireUser); 

     //start intent and sign out. 
     Intent intent = new Intent(getApplicationContext(), LoginActivity.class); 
     FirebaseAuth.getInstance().signOut(); 
     startActivity(intent); 
     finish(); 

    } 
} 
+0

'onComplete()'メソッドの本体を含むようにあなたの投稿を更新できますか?これにより、 'createNewUser()'の実行パスがより明確になります。 –

+0

私はonCompleteメソッドを追加しました。私はそれが助けて欲しい! – Hnig

答えて

1

データベースへの書き込みは同期完了しません。

 //start intent and sign out. 
    Intent intent = new Intent(getApplicationContext(), LoginActivity.class); 
    FirebaseAuth.getInstance().signOut(); // <== Can't do this here! 
    startActivity(intent); 
    finish(); 

createNewUser()では、あなたは書き込みが完了したときに見にsetValue()コールにログ文でCompletionListenerを追加することができます:データベース操作が完了するまでの時間を持って前にサインアウトしています。また、ログイン/ログアウトが完了したことを検出するために、AuthStateListenerにlogステートメントを追加することもできます。これらのログは、DB書き込みの前にログアウトが完了していることを確認する必要があります。

関連する問題