Javascript 如何在Firestore上以有限的权限使用Admin SDK?
我在云功能和firestore规则方面遇到了一些问题。 我想在Firestore上使用具有有限权限的云功能,并提供 仅具有安全规则中定义的访问权限 它在RTDB上工作没有问题,但在Firestore上没有问题 我试过这个规则Javascript 如何在Firestore上以有限的权限使用Admin SDK?,javascript,firebase,firebase-security,google-cloud-functions,google-cloud-firestore,Javascript,Firebase,Firebase Security,Google Cloud Functions,Google Cloud Firestore,我在云功能和firestore规则方面遇到了一些问题。 我想在Firestore上使用具有有限权限的云功能,并提供 仅具有安全规则中定义的访问权限 它在RTDB上工作没有问题,但在Firestore上没有问题 我试过这个规则 service cloud.firestore { match /databases/{database}/documents { match /init/{ID=**} { allow read, write: if true; }
service cloud.firestore {
match /databases/{database}/documents {
match /init/{ID=**} {
allow read, write: if true;
}
match /test/{ID=**} {
allow read, write: if false;
}
}
}
还有这个
const admin = require('firebase-admin');
const functions = require('firebase-functions');
const FieldValue = require('firebase-admin').firestore.FieldValue;
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: 'https://******.firebaseio.com',
databaseAuthVariableOverride: {
uid: 'my-worker',
},
});
const db = admin.firestore();
exports.onTestRights = functions.firestore
.document('init/{initID}')
.onCreate((event) => {
const initID = event.params.initID;
return db.collection('test').doc(initID).set({'random key': 'random value'}).then(()=>{
console.log('working');
return;
}).catch((err) =>{
console.log('error: ', err);
return;
});
});
但它仍然这样写,而它应该是“拒绝许可”
有人知道firestore上的这是正常的(或尚未植入),还是我误解了什么
编辑:
当然,我的最终目标不是使用此规则,而是使用(允许读取,写入:if request.auth.uid=='my worker';
)只允许对某些文档/集合进行写/读访问
Edit2:
我想使用安全规则来像事务一样检查过程中是否没有更改,正如您所注意到的
databaseAuthVariableOverride
仅适用于实时数据库。现在没有任何东西允许您在AdminSDK中对Firestore执行相同的操作
如果要限制服务器代码的访问权限,可以使用一种变通方法,即使用客户端JS SDK而不是Firebase Admin,并使用自定义令牌对用户进行登录。下面是执行此操作的示例代码:
// Configure Firebase Client SDK.
const firebase = require('firebase/app');
require('firebase/auth');
require('firebase/firestore');
firebase.initializeApp({
// ... Initialization settings for web apps. You get this from your Firebase console > Add Firebase to your web app
});
// Configure Firebase Admin SDK.
const admin = require('firebase-admin');
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
});
// Create Custom Auth token for 'my-worker'.
const firebaseReady = admin.auth().createCustomToken('my-worker').then(token => {
// Sign in the Client SDK as 'my-worker'
return firebase.auth().signInWithCustomToken(token).then(user => {
console.log('User now signed-in! uid:', user.uid);
return firebase.firestore();
});
});
// Now firebaseReady gives you a Promise that completes with a authorized firestore instance. Use it like this:
exports.onTestRights = functions.firestore
.document('init/{initID}')
.onCreate(event => {
const initID = event.params.initID;
return firebaseReady.then(db => db.collection('test').doc(initID).set({'random key': 'random value'}).then(() => {
console.log('working');
return;
}).catch((err) =>{
console.log('error: ', err);
return;
});
);
});
您的示例无效,我有此错误()。在谷歌上搜索后,我发现这是因为
require('firebase/firestore')代码>是必需的。因此,我通过npm安装添加了所需的依赖项(grpc和protobufjs),我得到了另一个错误:看起来您的上一个问题发生在使用protobufjs v6的人身上。您可以尝试将protobufjs v5添加为一个依赖项吗?此功能已在路线图上(我们希望构建它),但我们还没有可以共享的时间框架…@Nivco最新版本现在正在运行。但请注意,发布的示例代码中缺少return语句的bug应该是“return firebase.auth().signiWithCustomToken…”ThanksI getserviceAccount未定义
此设置在哪里?它包含什么?