В Котлине отказано в разрешении на пожарную базу - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть проект Android Kotlin, в котором я пытаюсь получить список всех документов из коллекции (в корне), называемой «средами» в firebase firestore.Это все ново для меня, но я не могу заставить его работать.Исследования онлайн не дали мне правильных ответов о моей ситуации.

Структура хранилища:

ROOT
- environments (is a collection)
  - fMzUHbiK7QMsyEdnLmmfksu0j5L2 (is a document)
    - name: "number1" (is a field)
  - rgeEwg7RhWgWaqlmhwg46dWSfowl (another document, etc.)
    - name: "number2"
- users
- etc.

Правила безопасности:

(яконечно, 2-й части (небезопасной) будет достаточно, но я просто попытался явно)

service cloud.firestore {
  match /databases/{database}/documents {

    match /environments/{document=**} {
      allow read, write: if true;
    }

    match /{document=**} {
      allow read, write: if true;
    }
  }
}

Я использовал помощник Firebase, чтобы связать мое приложение с firebase.Также попробовал ручной метод.Итак, у меня есть это:

уровень корня build.gradle

buildscript {
    // ...
    dependencies {
        // ...
        classpath 'com.google.gms:google-services:4.2.0' // google-services plugin
    }
}

allprojects {
    // ...
    repositories {
        google() // Google's Maven repository
        // ...
    }
}

app/build.gradle

apply plugin: 'com.android.application'

android {
  // ...
}

dependencies{
  // ..
  implementation 'com.google.firebase:firebase-core:16.0.7'
  implementation 'com.google.firebase:firebase-firestore:18.0.1'
}

apply plugin: 'com.google.gms.google-services'

У меня есть файл google-services.json в том жекаталог как корневой уровень build.gradle, как упомянуто в документации.

Я создал проект Kotlin с 1 кнопкой (просто для контроля, когда функции запускаются, запуск этой функции будет автоматизирован позже). Обратите внимание, что я не аутентифицирую пользователей, я пытаюсь создать для всех счастливые потоки, аутентификация и безопасность появятся позже.

Kotlin

Теперь следующий кодв основном из официальной документации

lateinit var db: FirebaseFirestore

override fun onCreate(savedInstanceState: Bundle?) {
  // ...
  db = FirebaseFirestore.getInstance()

  button.setOnClickListener {
  db.collection("environments")
   .get()
     .addOnSuccessListener { result ->
       for (document in result) {
         Log.d("success", document.id + " => " + document.data)
       }
     }
     .addOnFailureListener { exception ->
         Log.d("fail", "Error getting documents: ", exception)
       }
     }
   }
}

Debug / log

I/Firestore: (0.6.6-dev) [FirestoreClient]: Initializing. user=null
I/Firestore: (0.6.6-dev) [Persistence]: Starting transaction: Start MutationQueue
I/Firestore: (0.6.6-dev) [Persistence]: Starting transaction: Allocate query
W/eldingenish_cw: Accessing hidden field Ljava/nio/Buffer;->address:J (light greylist, reflection)
I/Firestore: (0.6.6-dev) [WatchStream]: (e57e2f1) Stream sending: # com.google.firestore.v1.ListenRequest@d97c49a6
    add_target {
      query {
        parent: "projects/[projectname-hidden]/databases/(default)/documents"
        structured_query {
          from {
            collection_id: "environments"
          }
          order_by {
            direction: ASCENDING
            direction_value: 1
            field {
              field_path: "__name__"
            }
          }
        }
      }
      target_id: 2
    }
    database: "projects/[projectname-hidden]/databases/(default)"

I/Firestore: (0.6.6-dev) [FirestoreCallCredentials]: Successfully fetched token.
I/Firestore: (0.6.6-dev) [WatchStream]: (e57e2f1) Stream is ready
I/Firestore: (0.6.6-dev) [WatchStream]: (e57e2f1) Stream received headers: {date=Wed, 27 Feb 2019 12:34:34 GMT}
I/Firestore: (0.6.6-dev) [WatchStream]: (e57e2f1) Stream received: # com.google.firestore.v1.ListenResponse@72b77077
    target_change {
      target_change_type: ADD
      target_change_type_value: 1
      target_ids: 2
    }
I/Firestore: (0.6.6-dev) [WatchStream]: (e57e2f1) Stream received: # com.google.firestore.v1.ListenResponse@d3efdcbe
    target_change {
      cause {
        code: 7
        message: "Missing or insufficient permissions."
      }
      target_change_type: REMOVE
      target_change_type_value: 2
      target_ids: 2
    }
I/Firestore: (0.6.6-dev) [Persistence]: Starting transaction: Release query
W/Firestore: (0.6.6-dev) [Firestore]: Listen for Query(environments) failed: Status{code=PERMISSION_DENIED, description=Missing or insufficient permissions., cause=null}

D/fail: Error getting documents:
com.google.firebase.firestore.FirebaseFirestoreException: PERMISSION_DENIED: Missing or insufficient permissions.

Caused by: io.grpc.StatusException: PERMISSION_DENIED: Missing or insufficient permissions.

Эксперимент

Я начал верить, что мой код неисправен, поэтому я экспериментировал с некоторыми ..

Альтернатива

.addSnapshotListener { querySnapshot, firebaseFirestoreException ->
  if(firebaseFirestoreException != null) {
    Log.d("main", "Error ggetting documents")
    return@addSnapshotListener
  }

  querySnapshot?.documents?.forEach {document ->
    Log.d("main", document.id + " => " + document.data)
  }
}

Добавление документа

val item = HashMap<String, Any>()
item["name"] = "test"
db.collection("environments")
  .add(item)
    .addOnSuccessListener { documentReference ->
      Log.d("main", "DocumentSnapshot written with ID: " + 
      documentReference.id)
    }
    .addOnFailureListener { e ->
      Log.w("main", "Error adding document", e)
    }

Ничто, похоже, не имеет разрешения, хотя мои правила безопасности хорошиимо?(Я не могу проверить get collection в симуляторе, он работает только с путями документов). Я вижу, что приложение связано с проектом в консоли.Также учитывается использование операций чтения из хранилища.

Кто-нибудь может мне помочь?

Обратите внимание, что я за брандмауэром Zscaler.Я импортировал сертификат в Android Studio.У моего эмулятора есть доступ в Интернет, но все сертификаты SSL считаются недействительными.Я также пытался запустить приложение на своем реальном телефоне с подключением к Интернету 4G (без Zscaler).

1 Ответ

0 голосов
/ 27 февраля 2019

Я удалил учетные записи сервисов Google (в облачной платформе) при создании проекта.Пытался начать с нуля, оказывается, SDK использует эти учетные записи служб.

Решение: не удаляйте автоматически созданные учетные записи служб!

Будьте внимательны, добавляя эти службыучетные записи вручную возможны, но вы не можете выбрать роли, которые они получают при создании проекта, вы должны сделать их владельцем или выбрать конкретные разрешения методом проб и ошибок, чтобы выяснить, что им нужно.

Другой альтернативный способ запроса

.addOnCompleteListener { task ->
    if (task.isSuccessful) {
        for (document in task.result!!) {
            Log.d("1", document.id + " => " + document.data)
        }
    } else {
        Log.w("1", "Error getting documents.", task.exception)
    }
}

Код из исходного поста работает и сейчас!(и аккуратнее имо)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...