firebase - 第二个 Firebase 项目无法访问第一个项目 Firestore
问题描述
我正在建立一个电子商务网站和管理仪表板。
使用自己的托管、Firestore 和身份验证的网站。
管理仪表板自己的托管和身份验证,但使用网站 Firestore 。
安全规则不允许我进入。当我将管理仪表板项目 ID 更改为网站一时,我可以访问网站 Firestore。
我在想它知道我来自第二个项目,为什么它不允许我访问网站 Firestore。
如何允许第二个项目访问第一个项目 Firestore
function authorize() {
return request.auth != null &&
request.auth.token.email_verified;
}
function matchOwnID(userID) {
return request.auth.uid == userID;
}
function authAdmin() {
return authorize() &&
exists(/databases/$(database)/documents/admin/$(request.auth.uid));
}
match /admin/{adminID} {
allow get : if authAdmin() && 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;
}
解决方案
如何允许第二个项目访问第一个项目 Firestore
您不能让用户通过一个 Firebase 项目的身份验证服务访问另一个 Firebase 项目的 Firestore 数据库,该项目具有基于用户身份验证状态的安全规则。这是不可能的,因为您无法在不同项目之间共享Firebase ID 令牌。
一种解决方案是在您的应用程序中配置两个项目,如“配置多个项目”文档中所述。
然后,您将能够使用与两个 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 项目的身份验证服务?一种常见的方法是使用该项目的 Auth 服务将您的主应用程序放在第一个 Firebase 项目中。然后使用第二个 Firebase 项目来托管管理仪表板应用程序。但是,在管理仪表板应用程序中,您指向第一个项目。
另一种可能的方法是在单个 Firebase 项目中设置两个 Firebase 托管站点,有关详细信息,请参阅文档。
推荐阅读
- android - 在 Flutter 中更改文本字段 Thumb?
- python - 避免“DoesNotExist at /”
- symfony - 如何在 Symfony 4 中定义整个数据库模式?
- regex - python中的特定正则表达式
- javascript - 数组怎么可能是未定义的?
- algorithm - 为什么 Randomized_Select 算法是这样的?
- kotlin - 将包含静态工厂方法的 Java 类转换为 Kotlin 时出现问题
- javascript - 使用打字稿导入将开放层映射加载到电子 js
- java - 插入枚举值时如何修复“无法推断用于枚举实例的 SQL 类型”错误?
- javascript - 任何好的 javascript 范围荧光笔