База данных FirebaseAuthVariableOverride не работает - PullRequest
0 голосов
/ 12 мая 2018

Я следовал этим указаниям Firebase , и в течение последних нескольких недель я использовал databaseAuthVariableOverride, чтобы позволить пользователям использовать Algolia для запуска результатов поиска в моем приложении и доступа к базе данных.Я изменил свой ключ API учетной записи службы Firebase ранее сегодня, и теперь databaseAuthVariableOverride больше не работает, и я не могу получить доступ к базе данных.

До того, как я изменил свой ключ API, все работало нормально, когда я устанавливал свои правила и приложение.js файл в:

правила Firebase:

{
  "rules": {
    ".read": "auth.uid === 'my-service-worker'", // matches the databaseAuthVariableOverride
    ".write": "auth.uid != null"
  }
}

и мой файл App.js в:

var admin = require("firebase-admin");
admin.initializeApp({
  credential: admin.credential.cert({
    projectId: .....,
    privateKey: "-----BEGIN PRIVATE KEY-----oldPrivateKey----END PRIVATE KEY-----\n",
    clientEmail: .....
  }),
  databaseURL: .....,
  databaseAuthVariableOverride: {
       uid: "my-service-worker" // matches the rules
    }
});

Когда я изменил свою учетную запись службы, я пошел ProjectOverview > ProjectSettings > ServiceAccounts > Создать новый закрытый ключ .После нажатия Generate New Private Key * новый ключ был загружен в мой процессор.enter image description here

Я проверил разрешения внутри IAM, а адрес электронной почты клиента учетной записи службы установлен на Editor.

Затем я взял новый закрытый ключ, которыйбыл сгенерирован как -----BEGIN PRIVATE KEY-----newPrivateKey----END PRIVATE KEY-----\n, скопирован и вставлен в мой файл app.js, где был установлен мой старый закрытый ключ:

admin.initializeApp({
      credential: admin.credential.cert({
        // my new private key
        privateKey: "-----BEGIN PRIVATE KEY-----newPrivateKey----END PRIVATE KEY-----\n" 

Теперь единственный способ, которым он работает, - это установить мои правила Firebase на:

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

Ключ API должен работать, иначе я не смог бы ничего прочитать с установленными правилами true

Когда я попытаюсь сделать вещи оригинальным способомКогда я установил правила, чтобы соответствовать my-service-worker, файл app.js больше не предоставлял доступ к базе данных.

В комментариях @Doug Stevenson предложил мне изменить все поля, которые пришли с новым СервисомУчетная запись, но проблема в том, что я использовал только 3 поля из старой служебной учетной записи из этих 3-х, единственное, что было изменено, это закрытый ключ.Другие 2 поля имеют одинаковые значения.Есть несколько других, с которых я никогда не начинал:

enter image description here

Это значения, которые используются внутри файла app.js:

enter image description here

В чем может быть проблема?

ОБНОВЛЕНИЕ @ Дуг Стивенсон говорил, что каждый разсоздается новая учетная запись службы, с ней также должна создаваться новая электронная почта клиента.Я создал 5 учетных записей служб, а первые 4 сохранили ту же электронную почту клиента.Я не уверен, почему это произошло, но я зашел в консоль Google Cloud, сгенерировал свою собственную, удалил старые и ничего не получилось.Затем я вернулся к консоли Firebase с синей кнопкой, нажал ее, и затем я получил новое электронное письмо от клиента.Мне потребовалось 5 загрузок учетной записи службы, чтобы изменить его ???Как бы то ни было, я обновил значения с помощью новой электронной почты клиента и связанного с ней закрытого ключа, и мои проблемы все еще сохраняются.Я также проверил разрешения, и для них установлено значение «Редактор».

Я отправил Firebase по электронной почте справку и жду ответа.

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Я дважды инициализировал базу данных, и именно поэтому databaseAuthVariableOverride не работал правильно.

admin.initializeApp({
  credential: admin.credential.cert({
    projectId: process.env.FIREBASE_PROJECT_ID,
    privateKey: process.env.FIREBASE_PRIVATE_KEY.replace(/\\n/g, '\n'),
    clientEmail: process.env.FIREBASE_CLIENT_EMAIL
  }),
  databaseURL: process.env.FIREBASE_DATABASE_URL,
  databaseAuthVariableOverride: {
    uid: process.env.TOKEN
  }
});

// 1st initialization
const db = admin.database();
const firstRef = db.ref(process.env.INDEX_NAME); // I only needed to use this
firstRef.once("value", function(snapshot) {
  console.log(snapshot.val());
});

// ****2nd initialization****
const secondRef = firebase.database().ref(process.env.INDEX_NAME); // this second initialization was causing a problem with the first one

2-я инициализация привела к тому, что databaseAuthVariableOverride не работал.Как только я закомментировал это, databaseAuthVariableOverride начал работать каждый раз, когда я менял его со значения на null и обратно.

Мне нужно только использовать firstRef в качестве базовой ссылки, и все было хорошо.

0 голосов
/ 12 мая 2018

Если вы хотите заменить служебную учетную запись, вам необходимо обновить ВСЕ значения полей сертификата, а не только поле privateKey.

Вместо этого, в идеале, вы просто заменяете весь файл JSON, который вы require() из вашего проекта.Это, вероятно, намного лучше, чем жесткое программирование всего в исходном файле, особенно если ваш проект с открытым исходным кодом, и вы не хотите делиться своими учетными данными со всем миром.Или даже с вашими коллегами, у которых есть разные песочницы проекта, которые они также используют для разработки.

...