此处的Firestore安全规则存在一些问题。我有一个使用Firebase和Firestore的带有自定义API的React / Redux SPA。
我目前正在使用Firebase官方文档(https://firebase.google.com/docs/auth/admin/manage-cookies)中所述的会话cookie。因此,当我登录时,将设置cookie并将其与随后的请求一起发送给API,这没问题。
但是现在,当我使用会话cookie系统登录时,由于不再设置Firestore请求的request.auth对象,因此Firestore规则不允许我读取或写入带有“权限被拒绝”错误的数据会话cookie系统...
如何在Firestore安全规则中检测用户是否通过会话cookie进行了身份验证?
使用会话cookie在我的Firebase外部API中登录路由:
login(req, res) {
auth.setPersistence(firebase.auth.Auth.Persistence.NONE);
auth.signInWithEmailAndPassword(req.query.email, req.query.password)
.then((response) => response.user.getIdToken().then((idToken) => {
const expiresIn = 60 * 15 * 1000;
admin.auth().createSessionCookie(idToken, { expiresIn })
.then((sessionCookie) => {
const options = { maxAge: expiresIn, httpOnly: true, secure: !!process.env.NODE_ENV === 'production' };
res.cookie('session', sessionCookie, options);
auth.signOut();
res.json(response);
}, () => {
res.status(401).write('Error while verifying token.');
});
})).catch((err) => {
console.error(err);
});
},
基本用户使用Firestore获得相同的API;登录后立即在请求标头中设置了cookie的情况下调用了该调用:
权限被从Firestore安全规则拒绝: 我需要使用的旧Firestore安全规则: 非常感谢!get(req, res) {
const { uid } = req;
db.collection('users').doc(uid).get().then((doc) => {
res.json(doc.data());
})
.catch((err) => {
console.log(req.path);
console.error(err);
res.json(err);
});
},
Error [FirebaseError]: Missing or insufficient permissions.
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
function isSignedIn() {
return request.auth != null;
}
match /users/{userId} {
allow create, update, get: if isSignedIn();
}
match /medic/{medicId} {
allow create, read: if isSignedIn();
}
}
}
答案 0 :(得分:0)
好的,所以我在这里找到了解决方案。我没有在服务器端API中使用Firebase Admin SDK,这就是为什么检查Firestore安全规则的原因,因为系统认为这是客户端请求。
我必须限制Firestore安全规则中的所有操作,然后使用Firebase Admin SDK在API中执行数据库操作(显然,由于未使用Firestore安全规则,因此我需要自己检查数据和身份验证;但是通过Firebase会话Cookie,情况已经如此
在深入研究安全规则时,您最终会发现Firebase Admin SDK的请求不受规则限制。 Admin SDK使用服务帐户进行了初始化,从而使SDK可以完全访问您的数据。在Firebase实时数据库中,您可以将Admin SDK的权限划分为用户ID,并照常执行规则。但是其他产品,最著名的是Google Cloud Firestore,尚不支持此功能。在实施服务器端数据访问操作时,应注意这一点。
请参阅:https://firebase.googleblog.com/2019/03/firebase-security-rules-admin-sdk-tips.html