Здесь есть небольшая проблема с правилами безопасности Firestore. У меня есть React / Redux SPA с пользовательским API, использующим Firebase и Firestore.
В настоящее время я использую куки сессии, как описано в официальной документации Firebase (https://firebase.google.com/docs/auth/admin/manage-cookies). Поэтому, когда я вхожу в систему, cook ie устанавливается и отправляется с последующими запросами к API, никаких проблем с этим нет.
Но теперь, когда я вошел в систему с системой session cook ie правила Firestore не позволяют мне читать или записывать данные с ошибкой «отказано в разрешении», поскольку объект request.auth запроса Firestore больше не устанавливается с сеансом cook ie system ...
Как я могу определить, прошла ли аутентификация пользователя с помощью Cook Cooking ie в моих правилах безопасности Firestore?
маршрут входа в мой внешний API Firebase с использованием сеанса Cook ie:
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);
});
},
basi c пользователь получает в том же API с помощью Firestore; вызывается сразу после входа в систему с параметром cook ie, установленным в заголовке запроса:
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();
}
}
}
Большое спасибо!