В ответном нативном приложении (через Экспо) с использованием разрешений firestore - request.auth всегда имеет значение null

Здесь мой код:

firebase.auth().onAuthStateChanged((user) => {
    if (user) {
        console.log("We are authenticated now!");
        firebase.firestore().collection("users")
            .doc(firebase.auth().currentUser.uid).set({ name: "new name" });
    } else {
        loginWithFacebook();
    }
});

И вот мои правила прав:

service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId} {
      allow read, write: if request.auth != null;
    }
  }
}

Кажется, что независимо от того, request.auth всегда null. Ошибка, которую я получаю:

Firestore (4.8.0) 2017-12-20T04: 18: 27.321Z [Connection]: WebChannel полученная ошибка: { "код": 403, "сообщение": "Отсутствует или недостаточно разрешения" "статус.": "PERMISSION_DENIED" }

Ответ 1

Я понизился до Firebase SDK 4.6.2, когда у меня возникла эта проблема с последним Firebase JS SDK на Expo.

Кроме того, вы должны сделать это, чтобы все работало:

Скопировать https://gist.githubusercontent.com/mikelehen/444950a35019208f3aaf18d37ab4937c/raw/85ac4cb3108d92163cb8f04fbdddcc88d4081aab/index.js

поверх node_modules/@firebase/webchannel-wrapper/dist/index.js

Без этого вы ничего не получите из своих коллекций.

Надеюсь, что это поможет.

Ответ 2

Я отправил запросы из того же кода, который работает в браузере, по сравнению с выставкой. Я заметил одно отличие - отсутствовал заголовок Origin. Я исправил xhr, и он работает для моего использования. Я не уверен, является ли это ошибкой или ожидаемым поведением. Я спросил о Slack/FireStore и Discord/реагировать на родной, но не получил большой вклад.

const xhrInterceptor = require('react-native/Libraries/Network/XHRInterceptor')
xhrInterceptor.setSendCallback((data, xhr) => {
  if (xhr._method === 'POST') {
    // WHATWG specifies opaque origin as anything other than a uri tuple. It serializes to the string 'null'.
    // https://html.spec.whatwg.org/multipage/origin.html
    xhr.setRequestHeader('Origin', 'null')
  }
})
xhrInterceptor.enableInterception()

Ответ 3

Кажется, что ошибка - как это испытали и другие пользователи с высокой репутацией. Я уточню, когда найдем исправление. Если кто-то получил его работу (на основе реакции через выставку), пожалуйста, поделитесь.

Ответ 4

Извините, что опоздал на вечеринку, но я просто наткнулся на это и подумал, что поделюсь своим опытом. У меня была точно такая же проблема, и после нескольких месяцев исследований и отладки она разрешилась, когда я обновился до firebase v 5. Вот ссылка на мой пост SO и решение. Надеюсь, это поможет:fooobar.com/questions/15644529/...

Ответ 5

Я исправил эту проблему, понизив версию Firebase до 5.0.0 (я использовал версию 6.4). Надеюсь, что это может помочь другим..

  1. В вашем package.json
dependencies: {
  "firebase": "^5.0.0"
}
  1. обновить зависимости

npm install

Ответ 6

Сначала проверьте содержимое на FIREBSAE Rule Exectuion Simulator,

и, во-вторых, ваша проблема звучит так, как будто вы не в Sync, проверьте свои правила (если это возможно) в веб-представлении, поскольку я попытался сделать то же самое, и это сработало для меня

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

Ответ 7

Пожалуйста, зарегистрируйте свой UID и подтвердите, что он не является нулевым. Затем измените правило разрешения как -

// Grants a user access to a document matching their Auth user Id
    service cloud.firestore {
       match /databases/{database}/documents {
         // Collection named "users", document named after the userId
       match /users/{userId} {
         allow read, write: if request.auth.uid == userId;
       }
     }
  }