認証でデータベースの読み取りと書き込みを行いたいが、私は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()); } });
書き込みテスト:
devs
とemployers
:私は、ユーザーの二つのカテゴリーでメインノード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つのテストを行った(書き込み:真、読み:真)と、それは働いていたので、何かがと間違っている必要があります私の認証。私はおそらく誤解している/何かを見逃しているが、本当に正確に何かを見ていない。誰かが私を啓発したい場合は非常にいいだろう!
Firebaseコンソールに登録されているユーザと権限タブのスクリーンショットを共有できますか? –
ルールを[シミュレータ](http://stackoverflow.com/a/37911209/4695325)でテストしましたか?さらなる助けが必要な場合は、ここに結果を掲載することができます。 また、あなたのログからは、あなたのアプリケーションが起動するたびに 'createUserWithEmailAndPassword'と' signInWithEmailAndPassword'が呼び出されているようです。ユーザが既にログインしているかどうかを検出するには 'onAuthStateChanged'を使うべきです。もし彼がすでに登録されていてログインしたいのであれば、" account "または" signInWithEmailAndPassword "を作成する必要があるなら' createUserWithEmailAndPassword'を使用してください。 –
@DevidFarinelli I (私のアプリでは私は電子メール/パスワード認証を使用しているので) 'カスタム'認証を使用してシミュレータでルールをテストしたところ、両方に対してうまく機能するので、問題は認証プロセスにあると仮定します。このコードはSignupActivityに由来しているので、毎回ユーザーを作成して署名しています。 – raphh