node.js - Firebase 数据库AuthVariableOverride 不起作用

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

我关注了这些Firebase directions在过去的几周里,我一直在使用 databaseAuthVariableOverride 让用户使用 Algolia 在我的应用程序中运行搜索结果并访问数据库。我今天早些时候更改了 Firebase 服务帐户 API key ,现在 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> 生成新私钥。按生成新私钥后,新 key 已下载到我的 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 Stevenson 建议我更改新服务帐户附带的所有字段,但问题是我只使用了旧服务帐户中的 3 个字段,其中 3 个字段中唯一更改的是私钥。其他 2 个字段具有相同的值。 还有其他几个我从未使用过的:

enter image description here

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

enter image description here

可能是什么问题?

更新 @Doug Stevenson 说,每次生成新的服务帐户时,也应该生成新的客户电子邮件。我生成了 5 个服务帐户,前 4 个保留相同的客户电子邮件。我不知道为什么会发生这种情况,但我去了 Google Cloud Console,生成了自己的控制台,删除了旧的控制台,但没有任何效果。然后我用蓝色按钮返回 Firebase 控制台,按下它,然后我收到了一封新的客户电子邮件。我花了 5 次服务帐户下载才更改它???无论如何,我用新的客户电子邮件及其关联的私钥更新了这些值,但我的问题仍然存在。我还检查了权限并将其设置为编辑器。

我向 Firebase 发送了电子邮件寻求帮助,正在等待回复。

最佳答案

我初始化了数据库两次,这就是 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 作为基本引用,一切都很好。

关于node.js - Firebase 数据库AuthVariableOverride 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50302031/

相关文章:

java.lang.RuntimeException : Layout cannot be null. 调用 setLayout

javascript - Firebase:如何停止收听快照

node.js - Node 邮件程序错误

android - 使用 android 在 firebase 数据库中搜索子节点

java - 当 Firebase 中的值发生更改时,Sharedpreferences 值会更新

node.js - Mongoose 4.11.0 promise 超时

node.js - 将自定义查询参数添加到 Passport auth0 策略验证请求

android - 使用 Kotlin 在 Firestore 数据库中上传数据。无法存储数据

javascript - 从字符串中获取 url 作为数组

javascript - 在 NodeJS 中使用快速路由方法时出错