В доступе отказано: отсутствует или недостаточно разрешений для Android, но работает для ios Firestore - PullRequest
0 голосов
/ 07 марта 2020

Я пытаюсь обновить свою базу данных в firestore на устройстве android, но получаю сообщение об ошибке «Отсутствует или недостаточно разрешений». Если это из-за правил, то же правило работает нормально для обновления в iOS, но не в android. Может кто-нибудь указать мне на правильное правило. Ниже приведено правило, которое я использую

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {

    // This rule allows anyone on the internet to view, edit, and delete
    // all data in your Firestore database. It is useful for getting
    // started, but it is configured to expire after 30 days because it
    // leaves your app open to attackers. At that time, all client
    // requests to your Firestore database will be denied.
    //
    // Make sure to write security rules for your app before that time, or else
    // your app will lose access to your Firestore database


    match /users/{userId} {
      allow read, update, delete: if request.auth != null;
      allow create: if request.auth != null;
    }
  }
}

Код, который я использую для обновления записи

 db.collection("user").document(documentSnaapShotId).update(userData).addOnSuccessListener(new OnSuccessListener<Void>() {
           @Override
           public void onSuccess(Void aVoid) {
               sendUserToInitialPage();
           }
       }).addOnFailureListener(new OnFailureListener() {
           @Override
           public void onFailure(@NonNull Exception e) {
               String error = e.getMessage();
               Toast.makeText(UpdateUserActivity.this, "Error:" + error, Toast.LENGTH_LONG).show();
           }
       });

Это изображение - это код, который я использовал для аутентификации Пользователь и код, указанный c, открывается, только если пользователь прошел проверку подлинности по телефону. Теперь во время отладки я обнаружил еще одну проблему, когда при нажатии на выход (FirebaseAuth.getInstance (). Signout) он возвращается на эту страницу и выдает ту же ошибку, и приложение само убивает себя. Я предполагаю, что есть какая-то проблема с тем, как я аутентифицирую пользователя. Любая помощь, пожалуйста. Ниже приведен весь код, который я использовал для аутентификации пользователя

private void signInWithPhoneAuthCredential(PhoneAuthCredential credential) {
        mAuth.signInWithCredential(credential)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful()) {
                            mFirestore = FirebaseFirestore.getInstance();
                            String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
                            mFirestore.collection("mydbexample").whereEqualTo("uid", uid).addSnapshotListener(new EventListener<QuerySnapshot>() {
                                @Override
                                public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
                                    if(e != null) {
                                        Toast.makeText(PhoneAuthActivity.this, "Error:" + e, Toast.LENGTH_LONG).show();
                                    }

                                    for(DocumentSnapshot doc : queryDocumentSnapshots) {
                                        docId = doc.getId();
                                        userFname = doc.getString("firstname");
                                        userLname = doc.getString("lastname");
                                        userCountry = doc.getString("country");
                                        userState = doc.getString("state");
                                        userCity = doc.getString("city");
                                        userArea = doc.getString("area");


                                        documentExists = (userFname!= null);

                                    }

                                    if(documentExists){

                                        sendUserToInitialPage();

                                    }

                                    else {

                                        sendUserToHome();
                                    }
                                }
                            });


                        } else {
                            if (task.getException() instanceof FirebaseAuthInvalidCredentialsException) {
                                Toast.makeText(getApplicationContext(),
                                        "Incorrect Verification Code ", Toast.LENGTH_LONG).show();
                            }
                        }
                    }
                });
    }

private void sendUserToHome() {
        Intent homeIntent = new Intent(PhoneAuthActivity.this, GuestUserActivity.class);
        homeIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        homeIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
        homeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        startActivity(homeIntent);
        finish();

    }

    private void sendUserToInitialPage() {
        Intent homeIntent = new Intent(PhoneAuthActivity.this, InitialPageActivity.class);

        homeIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        homeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        homeIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);

        startActivity(homeIntent);
        finish();

    }

Стек вызовов

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.app.virtualbloodbank, PID: 489
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.Iterator com.google.firebase.firestore.QuerySnapshot.iterator()' on a null object reference
        at com.app.virtualbloodbank.PhoneAuthActivity$4$1.onEvent(PhoneAuthActivity.java:224)
        at com.app.virtualbloodbank.PhoneAuthActivity$4$1.onEvent(PhoneAuthActivity.java:217)
        at com.google.firebase.firestore.Query.lambda$addSnapshotListenerInternal$2(com.google.firebase:firebase-firestore@@21.4.0:1039)
        at com.google.firebase.firestore.Query$$Lambda$3.onEvent(Unknown Source:6)
        at com.google.firebase.firestore.core.AsyncEventListener.lambda$onEvent$0(com.google.firebase:firebase-firestore@@21.4.0:42)
        at com.google.firebase.firestore.core.AsyncEventListener$$Lambda$1.run(Unknown Source:6)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
...