В ответном нативном приложении (через Экспо) с использованием разрешений 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). Надеюсь, что это может помочь другим..
- В вашем package.json
dependencies: {
"firebase": "^5.0.0"
}
- обновить зависимости
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;
}
}
}