aTo*_*aTo 3 javascript firebase firebase-security google-cloud-functions google-cloud-firestore
我在使用Cloud函数和Firestore规则时遇到了一些麻烦。我想在Firestore上使用具有有限特权的云功能,并且仅授予安全规则中定义的访问权限
它在RTDB上正常运行,但在Firestore上却没有问题。
我尝试了这个规则
service cloud.firestore {
match /databases/{database}/documents {
match /init/{ID=**} {
allow read, write: if true;
}
match /test/{ID=**} {
allow read, write: if false;
}
}
}
Run Code Online (Sandbox Code Playgroud)
和这个
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;
});
});
Run Code Online (Sandbox Code Playgroud)
但是它仍然在写,所以应该“拒绝权限”
有人知道这是正常的(还是尚未植入)在消防站上还是我误解了某些东西?
编辑:
当然,我的最终目标不是使用此规则,而是仅使用(allow read, write: if request.auth.uid == 'my-worker';
)授予对某些文档/集合的写/读访问权限
Edit2: 如果使用此模型的过程中没有更改,我想使用安全规则像交易一样进行检查
您已经注意到,databaseAuthVariableOverride
仅适用于实时数据库。现在,没有什么可以让您在Admin SDK中对Firestore执行相同的操作。
如果要限制服务器代码上的访问权限,可以使用的一种解决方法是使用Client 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;
});
);
});
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1102 次 |
最近记录: |