我对Firestore规则的所有测试都差不多。但是,我仍然需要测试管理员的一些路径。
我的应用程序中的管理员不是Firebase管理员,而是具有在customClaims中设置如下权限的用户:
claims: {admin: true}
如何使用npm软件包@firebase/testing
模拟用户customClaims?我不知道。
谢谢
PS:下面,我正在做什么。
export default class TestApplication {
public static getFirestoreInstance(auth, projectId: string): firebase.firestore.Firestore {
return firebase
.initializeTestApp({projectId, auth})
.firestore();
}
}
describe(){
const defaultAuthUser = {uid: "alice", email: "alice@example.com", "token": {"admin": true};
before(done => {
currentProjectId = TestUtils.getRandomId();
TestApplication.useFirestoreRules(currentProjectId, rules)
.then(() => done())
.catch(done);
});
it("I should be able to get another user if I'm an admin", () => {
return firebase.assertSucceeds(
TestApplication.getFirestoreInstance(defaultAuthUser, currentProjectId)
.collection(FirebaseReference.USERS_REF)
.doc(otherUserId)
.get()
);
}).timeout(5000);
}
答案 0 :(得分:2)
自定义声明可以作为auth
对象中的顶级字段传递:
firebase.initializeTestApp({
projectId: "my-test-project",
auth: { uid: "alice", my_custom_claim: "foo" }
});
在问题示例中,此行:
const defaultAuthUser = {uid: "alice", email: "alice@example.com", "token": {"admin": true};
应更改为:
const defaultAuthUser = {uid: "alice", email: "alice@example.com", admin: true};
答案 1 :(得分:0)
我想您正在使用这种方法: https://firebase.google.com/docs/firestore/security/test-rules-emulator#run_local_tests
因此,在测试代码中的某处您拥有:
firebase.initializeTestApp({
projectId: "my-test-project",
auth: { uid: "alice", email: "alice@example.com" }
});
在此身份验证字段中,您可以将自定义声明模拟为:
{
"uid": "alice",
"email": "alice@example.com",
"token": {
"admin" :true
}
}
然后,您可以在规则中使用request.auth.token.admin。我在存储设备上尝试过此操作,但相同/相似的内容也应适用于Firestore。
答案 2 :(得分:0)
我认为以上答案可能更具体。
初始化应用程序时,自定义声明需要在auth对象上。但是,当在安全规则中检查自定义声明时,自定义声明位于“令牌”属性(request.auth.token.admin
)中。
初始化应用程序:
firebase.initializeTestApp({
projectId: "my-test-project",
auth: { uid: "alice", my_custom_claim: "foo", admin: true }
});
firebase.rules
...
match /posts/{postId} {
allow update: if request.auth.token.admin
}
...