首页 > 解决方案 > 第二个 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;
}

标签: firebasegoogle-cloud-firestore

解决方案


如何允许第二个项目访问第一个项目 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 托管站点,有关详细信息,请参阅文档。


推荐阅读