@ firebase / testing-如何在Firestore规则测试中使用auth自定义声明?

时间:2018-12-03 16:00:11

标签: firebase testing google-cloud-firestore firebase-security-rules

我对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);
}

3 个答案:

答案 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 
}
...