为什么即使用户 ID 不正确但电子邮件是正确的,这仍然允许用户写入?

Why does this still allow the user to write even if the userID is not correct but the email is correct?

我用这个创建了一个用户:

这就是他们登录系统的方式:

const handleSubmit = async (e) => {
    e.preventDefault();
    const auth = getAuth();
    console.log(email, password, "1");
    setIsLoading(true);
    signInWithEmailAndPassword(auth, email, password)
      .then((userCredential) => {
        // Signed in

        const user = userCredential.user;
        setIsLoading(false);
        navigate("/Homepage");
        // ...
      })
      .catch((error) => {
        const errorCode = error.code;
        const errorMessage = error.message;
        setIsLoading(false);
        alert(errorMessage);
      });
  };

我正在设置 Firestore,只有登录的个人才能在所有集合 ordersproductcategory 和子集 history。这意味着,所有经过身份验证的用户都可以在所有集合和子集合中进行读写。

这是 Firestore 集合:

Firestore 安全规则:

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth != null;
    }
  }
}

现在,我正在使用 Rules playground 对此进行测试,但是,即使用户 ID 错误且电子邮件正确,它仍将允许访问。我的 Firestore 安全规则有问题还是我的 Rules playground 操作不正确?

Is there something wrong with my Firestore security rules or am I doing the Rules playground incorrectly?

都不是,它的工作原理与您假设的略有不同。

安全规则不检查您提供的 uid 是否匹配 email,因此 any uid 和 any 您的 auth 对象中的电子邮件(请参阅“身份验证有效负载”面板)将在 Playground 中传递您的安全规则。它通过了,因为正如您在“有效负载”面板中看到的那样,request.auth 不是 null

现在,你假设 anyone 可以发送 any uid 和 any email 到Firestore 并通过您的安全规则。 不是这样的

您的用户不会创建您在“身份验证有效负载”面板中看到的对象 - Firebase 在收到来自客户端的请求时在幕后为您执行此操作。

您的用户必须随请求一起发送令牌。此令牌是用户会话与 Firebase Auth 中特定用户之间的“粘合剂”。 Firebase 验证令牌是否有效,然后将身份验证详细信息作为 auth 添加到您的 request。在 Firestore 中,您可以访问安全规则中的那些身份验证详细信息。

在 Playground 中,您将接管 Firebase Auth 的角色并决定什么是身份验证有效负载。 Firestore 假定您的输入是正确的,并根据您提供的安全规则对其进行测试。您的 auth 负载通过了测试,因为您只测试它是否不是 null.

TL&DR: 您的安全规则没问题,Playground 只是假设您已生成有效的身份验证负载。在现实世界中,Firebase 会为您生成此负载。