我创建了使用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,因为它具有完全的管理权限。 那么我该如何解决这个问题呢?
答案 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
})