在Firebase管理员SDK上应用实时数据库规则

时间:2018-11-01 14:33:17

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

我创建了使用Firebase客户端SDK通过实时数据库规则授权用户的API,但是当我使用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,因为它具有完全的管理权限。 那么我该如何解决这个问题呢?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

如果您希望管理SDK在userAuth的许可下访问实时数据库,则在初始化databaseAuthVariableOverride时需要设置FirebaseApp。有关完整的详细信息和代码示例,请参见authenticate with limited privileges

答案 2 :(得分:0)

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
})