为什么即使用户 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,只有登录的个人才能在所有集合 orders
、product
、category
和子集 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 会为您生成此负载。
我用这个创建了一个用户:
这就是他们登录系统的方式:
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,只有登录的个人才能在所有集合 orders
、product
、category
和子集 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 会为您生成此负载。