Auth с несколькими базами данных Firebase в реальном времени в сети не работает - PullRequest
1 голос
/ 21 февраля 2020

У меня есть две базы данных Firebase в реальном времени. Мне удалось подключиться, прочитать и написать им обоим из моего веб-клиента. Тем не менее, я возвращаюсь к своим правилам безопасности и сделал так, чтобы вы могли читать / писать только если вы аутентифицировались с использованием

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

Однако по какой-то причине я теперь не могу подключиться к базе данных, это говорит, что разрешение отказано. Я аутентифицирован на клиенте с помощью Google, и все остальное с аутентификацией работает как положено. Например, я могу распечатать uid пользователя и все. Вот код на стороне клиента, который у меня есть (цензура).

  var firebaseConfig = {
apiKey: "------------------",
authDomain: "-------------",
databaseURL: "-------------",
projectId: "-------",
};
// Initialize Firebase
var app = firebase.initializeApp(firebaseConfig, 'app2');

firebase.database(app).ref('boards').child(boardID).once('value', function(snapshot) {//I do stuff here})

Ошибка:

Error: permission_denied at /boards/id: Client doesn't have permission to access the desired data.
    at util.ts:526
    at onComplete (SyncTree.ts:651)
    at Object.onComplete (Repo.ts:167)
    at PersistentConnection.ts:247
    at si.onDataMessage_ (PersistentConnection.ts:554)
    at ei.onDataMessage_ (Connection.ts:317)
    at ei.onPrimaryMessageReceived_ (Connection.ts:309)
    at $r.onMessage (Connection.ts:205)
    at $r.appendFrame_ (WebSocketConnection.ts:273)
    at $r.handleIncomingFrame (WebSocketConnection.ts:326)

И это сценарии Firebase, которые я использую

<script src="/__/firebase/7.6.1/firebase-app.js"></script>
<script src="/__/firebase/7.6.1/firebase-database.js"></script>
<script src="/__/firebase/7.8.1/firebase-auth.js"></script>
<script src="/__/firebase/init.js"></script>

Это известная ошибка? Я что-то пропустил? Спасибо.

Ответы [ 2 ]

1 голос
/ 21 февраля 2020

Я решил эту проблему, переключившись с

<script src="/__/firebase/7.6.1/firebase-app.js"></script>
<script src="/__/firebase/7.6.1/firebase-database.js"></script>
<script src="/__/firebase/7.8.1/firebase-auth.js"></script>
<script src="/__/firebase/init.js"></script>

на

  <script src="https://code.jquery.com/jquery-latest.min.js"></script>
  <script src="https://www.gstatic.com/firebasejs/7.9.0/firebase-app.js"></script>
  <script src="https://www.gstatic.com/firebasejs/7.9.0/firebase-database.js"></script>
  <script src="https://www.gstatic.com/firebasejs/7.9.0/firebase-auth.js"></script>

И удалив , 'app2) из var app = firebase.initializeApp(firebaseConfig, 'app2');

Это сделало вторую базу данных быть базой данных по умолчанию, и теперь все работает правильно. Однако, если когда-нибудь понадобится обе ссылки на базу данных на клиенте, это снова станет проблемой, и, насколько я могу судить, не может быть исправлено, пока разработчики Firebase не выпустят патч.

0 голосов
/ 21 февраля 2020

Firebase Authentication восстанавливает состояние аутентификации пользователя при перезагрузке страницы. Это требует обращения к серверу, что происходит асинхронно. Скорее всего, проверка подлинности еще не завершена, когда вы подключаете прослушиватель.

Чтобы это исправить, всегда подключайте прослушиватели, которым требуется аутентификация, в onAuthStateChanged callback :

// Initialize Firebase
var app = firebase.initializeApp(firebaseConfig, 'app2');

firebase.auth().onAuthStateChanged(function(user) {
  if (user) {
    firebase.database(app).ref('boards').child(boardID).once('value', function(snapshot) {//I do stuff here})
  }
}

Если у вас снова возникнут подобные проблемы, я рекомендую зарегистрировать UID активного пользователя, чтобы помочь в устранении неполадок:

console.log(firebase.auth().currentUser ? firebase.auth().currentUser.uid : "No user");
firebase.database(app).ref('boards').child(boardID).once('value', function(snapshot) {//I do stuff here})

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

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