【问题标题】:Apply real-time database rules on Firebase admin sdk在 Firebase admin sdk 上应用实时数据库规则
【发布时间】:2018-11-04 15:55:55
【问题描述】:

我创建的 API 使用 firebase 客户端 sdk 通过实时数据库规则授权用户,但是当我使用 firebase 应用生成的令牌时,api 返回“PERMISSION_DENIED”。

这是我的 api 的短代码:

// GET {{url}}/users

import * as admin from 'firebase-admin';
import * as firebase from 'firebase';

// admin sdk to verify generated token.
const userAuth = await admin.auth().verifyIdToken(accessToken); // return user object, no problem with that.
const user = await firebase.database().ref(`users/${userAuth.uid}/`).once('value'); // this causes "PERMISSION_DENIED" when fetch data from database.

我的数据库规则示例:

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

我使用 firebase 客户端 sdk 对其应用 db 规则,但我不想使用 admin sdk,因为它具有完全的管理员权限。 那么我该如何解决这个问题呢?

【问题讨论】:

  • 我不完全明白你在问什么。看起来有点像XY problem。你想在这个脚本中完成什么?
  • 我需要 admin SDK 以通过特定用户的令牌访问实时数据库。 (我无法多次初始化 admin sdk。

标签: javascript firebase-realtime-database firebase-admin firebase-security


【解决方案1】:

主要问题是您需要 admin sdk 来验证发送的令牌,然后您需要根据解码的令牌使用 databaseAuthVariableOverride 初始化 admin sdk!

【讨论】:

  • 你也不能多次初始化 admin sdk!
【解决方案2】:

如果您希望 admin SDK 以userAuth 的权限访问实时数据库,您需要在初始化FirebaseApp 时设置databaseAuthVariableOverride。有关完整的详细信息和代码示例,请参阅authenticate with limited privileges

【讨论】:

  • 如果我之前没有使用“verifyIdToken”初始化 admin sdk,我无法通过他的令牌验证用户,我之前尝试过您的解决方案,但出现错误“多次初始化 firebase”。
【解决方案3】:

admin.auth().verifyIdToken 只是检查令牌是否有效,它不保证对下一个功能的认可。所以你需要使用 firebase admin sdk 而不是客户端 api。

await admin.auth().verifyIdToken(accessToken).then(() => {
  //You code here
  admin.database().ref(`users/${userAuth.uid}/`).once('value');
}).catch(err => {
  //Token invalid
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 2021-07-01
    • 2021-01-31
    • 1970-01-01
    相关资源
    最近更新 更多