【发布时间】:2020-08-06 13:50:59
【问题描述】:
Firestore 安全规则存在一个小问题。我有一个使用 Firebase 和 Firestore 的带有自定义 API 的 React/Redux SPA。
我目前使用 Firebase 官方文档 (https://firebase.google.com/docs/auth/admin/manage-cookies) 中描述的会话 cookie。因此,当我登录时,cookie 被设置并与随后的 API 请求一起发送,这没问题。
但是现在当我使用会话 cookie 系统登录时,Firestore 规则不允许我读取或写入数据并出现“权限被拒绝”错误,因为不再设置 Firestore 请求的 request.auth 对象使用会话 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:
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);
});
},
Firestore 安全规则中的权限被拒绝错误:
Error [FirebaseError]: Missing or insufficient permissions.
我需要使用的旧 Firestore 安全规则:
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();
}
}
}
非常感谢!
【问题讨论】:
标签: firebase cookies google-cloud-firestore firebase-authentication firebase-security