#firebase #google-cloud-firestore
# #firebase #google-облако-firestore
Вопрос:
Я создаю веб-сайт электронной коммерции и панель администратора.
Веб-сайт, использующий собственный хостинг, Firestore и аутентификацию.
Панель администратора имеет собственный хостинг и аутентификацию, но использует веб-сайт Firestore.
Правила безопасности не позволяют мне войти. Когда я меняю идентификатор проекта панели администратора на идентификатор веб-сайта, я могу получить доступ к Firestore веб-сайта.
Я думаю, что я знаю, что я пришел из второго проекта, поэтому он не позволил мне получить доступ к веб-сайту Firestore.
Как я могу разрешить второму проекту доступ к первому Firestore проекта
function authorize() {
return request.auth != null amp;amp;
request.auth.token.email_verified;
}
function matchOwnID(userID) {
return request.auth.uid == userID;
}
function authAdmin() {
return authorize() amp;amp;
exists(/databases/$(database)/documents/admin/$(request.auth.uid));
}
match /admin/{adminID} {
allow get : if authAdmin() amp;amp; matchOwnID(adminID); <--cant access from second project but first project can access.
// allow get : if true; <-----can access from second project.
allow list : if false;
allow write: if false;
}
Ответ №1:
Как я могу разрешить второму проекту доступ к первому Firestore проекта
Вы не можете аутентифицировать пользователей через службу аутентификации одного проекта Firebase, получая доступ к базе данных Firestore другого проекта Firebase, который имеет правила безопасности, основанные на состоянии аутентификации пользователя. Это невозможно, поскольку вы не можете совместно использовать токены идентификатора Firebase в разных проектах.
Одним из решений является настройка двух проектов в вашем приложении, как описано в документе «Настройка нескольких проектов».
Затем вы сможете войти в систему с двумя разными учетными записями пользователей, соответствующими двум проектам Firebase.
Для Интернета это можно сделать следующим образом:
const primaryAppConfig = {
apiKey: '.....',
authDomain: '.....',
// ...
};
firebase.initializeApp(primaryAppConfig);
const secondaryAppConfig = {
apiKey: '.....',
authDomain: '.....',
// ...
};
var secondaryApp = firebase.initializeApp(
secondaryAppConfig,
'secondary'
);
firebase
.auth()
.signInWithEmailAndPassword(email1, password1)
.then(() => {
secondaryApp.auth().signInWithEmailAndPassword(email2, password2);
})
.then(() => {
firebase
.firestore()
.collection('...') // Firestore collection from the Primary Project
.get()
.then(function (querySnapshot) {
querySnapshot.forEach(function (doc) {
// doc.data() is never undefined for query doc snapshots
console.log(doc.id, ' => ', doc.data());
});
});
secondaryApp
.firestore()
.collection('...') // Firestore collection from the Secondary Project
.get()
.then(function (querySnapshot) {
querySnapshot.forEach(function (doc) {
// doc.data() is never undefined for query doc snapshots
console.log(doc.id, ' => ', doc.data());
});
});
});
Сказав это, вы на 100% уверены, что вам нужно использовать службы аутентификации двух проектов Firebase? Общий подход заключается в том, чтобы ваше основное приложение было в первом проекте Firebase, используя службу аутентификации этого проекта. А затем используйте второй проект Firebase только для размещения приложения Admin dashboard. Но в приложении Admin dashboard вы указываете на первый проект.
Другой возможный подход заключается в настройке двух хостинговых сайтов Firebase в одном проекте Firebase, подробнее см. Документ.
Комментарии:
1. я настроил. конфигурация 2 проектных работ
2. Хорошо, спасибо за отзыв. Так в чем же тогда проблема? Я не уверен, что понимаю.
3. значит, я должен использовать ту же аутентификацию (первый проект) для доступа к тому же firestore (первый проект)?
4. потому что оба сайта — это разные сайты, один для клиента, а другой для администратора, но оба должны использовать один и тот же firestore.
5. Да, служба аутентификации каждого проекта генерирует токены Firebase ID, которые действительны только для этого проекта.