Firebase databaseAuthVariableOverride不起作用

时间:2018-05-12 01:20:24

标签: node.js firebase firebase-realtime-database firebase-authentication firebase-admin

我按照这些Firebase directions进行了操作,过去几周我一直在使用databaseAuthVariableOverride让用户使用Algolia在我的应用中运行搜索结果并访问数据库。我今天早些时候更改了Firebase服务帐户API密钥,现在databaseAuthVariableOverride不再有效,我无法访问数据库。

在我更改Api Key之前,当我将规则和app.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 > 生成新私钥。按生成新私钥后,新密钥被下载到我的CPU。 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 Key必须工作否则我将无法阅读规则设置为true

的任何内容

当我尝试按照原始方式执行操作时,将规则设置为匹配my-service-worker时,app.js文件不再被授予对数据库的访问权限。

在评论@Doug史蒂文森建议我更改新服务帐户附带的所有字段,但问题是我只使用了旧服务帐户中的3个字段,其中唯一改变的是私有键。其他2个字段具有相同的值。 我还从未习惯过其他几个:

enter image description here

这些是app.js文件中使用的值:

enter image description here

可能是什么问题?

更新 @Doug Stevenson说,每次生成新的服务帐户时,都应该生成新的客户端电子邮件。我生成了5个服务帐户,前4个保留了相同的客户电子邮件。我不确定为什么会这样,但我去了谷歌云控制台,生成了我自己的,删除了旧的,没有任何效果。然后我用蓝色按钮返回Firebase控制台,按下它,然后我收到了一个新的客户端电子邮件。它花了5个服务帐户下载来改变它???无论如何,我使用新的客户端电子邮件和它的相关私钥更新了值,我的问题仍然存在。我还检查了权限,并将其设置为编辑。

我通过电子邮件向Firebase发送了求助信息,我等待回复。

2 个答案:

答案 0 :(得分:0)

如果要替换服务帐户,则需要更新所有证书字段值,而不仅仅是privateKey字段。

相反,理想情况下,您只需从项目中替换require()的整个JSON文件。这可能比硬编码源文件中的所有内容要好得多,特别是如果您的项目是开源的,并且您不想与全世界共享您的凭据。或者甚至与你的同事有不同的项目沙箱,他们也用于开发。

答案 1 :(得分:0)

我两次初始化了数据库,这就是为什么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

第二次初始化导致databaseAuthVariableOverride无法正常工作。一旦我将其注释掉,每次我将它从一个值更改为null并返回时,databaseAuthVariableOverride便开始工作。

我只需要使用firstRef作为基本参考,一切都很好。