验证网络中多个Firebase项目中的同一用户

时间:2018-08-08 09:12:27

标签: javascript firebase firebase-authentication google-cloud-firestore google-oauth

我正在开发一个网站。我将网站托管到Project-A,需要从另一个Firebase项目(Project-B)获取FireStore数据。我在网站上编写的示例代码是从Project-B获取数据

<script type="text/javascript">
    var primaryAppConfig = {
       apiKey: "<API_KEY>",
       authDomain: "<PROJECT_ID>.firebaseapp.com",
       databaseURL: "https://<DATABASE_NAME>.firebaseio.com",
       storageBucket: "<BUCKET>.appspot.com",
    }; // Project-A configuration

    var secondaryAppConfig = {
       apiKey: "<API_KEY>",
       authDomain: "<PROJECT_ID>.firebaseapp.com",
       databaseURL: "https://<DATABASE_NAME>.firebaseio.com",
       storageBucket: "<BUCKET>.appspot.com",
    }; // Project-B configuration

    var primary = firebase.initializeApp(primaryAppConfig);
    var secondary = firebase.initializeApp(secondaryAppConfig, "secondary"); 

    var db1 = primary.firestore();
    var db2 = secondary.firestore();

    // Some code to get the data from Project-A and I got the result.
    db1.collection('sample').get().then(snap => {
       size = snap.size;
       console.log("No.ofUsers",size); //Got result

    });

    // Some code to get the data from Project-B. And here, I am getting error like Error: Missing or insufficient permissions. Lack of permissions from Project-B.

    db2.collection('sample').get().then(snap => {
      var size = snap.size;
      console.log("TotalSample",size);
    }); 

</script>

所以我也需要在Project-B中对用户进行身份验证。为此,我编写了以下代码以登录到我的网站中

function signInUser() {
    var emailelement = document.getElementById("email");
    var passwordelement = document.getElementById("password");
    if (emailelement != null){
        var email = emailelement.value;         
    }
    if (passwordelement != null){
        var password = passwordelement.value;           
    }

    primary.auth().signInWithEmailAndPassword(email, password).then(function() {

        console.log("Logged into secondary");
        var user = primary.auth().currentUser;
        console.log(user.uid); // It showing Project-A UID

        secondary.auth().signInWithEmailAndPassword(email, password).then(function() {

        console.log("Logged into primary");
        var user = secondary.auth().currentUser;
        console.log(user.uid); // It showing Project-B UID

        }).catch(function(error) {
           // Handle Errors here.
           var errorCode = error.code;
           var errorMessage = error.message;

           if (errorCode === 'auth/wrong-password') {
                 alert('Wrong password.');
           } else {
                 alert(errorMessage);
           }

         });

    }).catch(function(error) {
      // Handle Errors here.
      var errorCode = error.code;
      var errorMessage = error.message;
      // ...

      if (errorCode === 'auth/wrong-password') {
            alert('Wrong password.');
      } else {
            alert(errorMessage);
      }

    });
    }

通过上述signInUser()函数,用户在两个项目中均已成功通过身份验证,并且登录后即可在home.html页面本身中获取FireStore。但是我需要在home.html页面中获取数据(我的网络中有很多页面需要登录)。我必须在home.html页面中进行操作才能获取当前用户。

//该用户使用相同的凭据但使用不同的UID一次登录了两个项目。

现在的问题是,在身份验证之后,我需要使用

导航到另一个页面
firebase.auth().onAuthStateChanged(function(user) {
        if (user) {

            var user = firebase.auth().currentUser;
            if(user != null){
                console.log(user.uid); // In auth state overall it showing the Project-B UID
                window.location = 'home.html';
            }       
        } else {
        // User is signed out.
        }
    });

在我的home.html页面中,它显示当前用户为空

firebase.auth().onAuthStateChanged(function(user) {

              var user = firebase.auth().currentUser; // it showing null   
                if(!user)
                {
                  console.log("SignOut");
                  window.location='/';
                }
                else
                {    
                  console.log(user.uid);
                }
            });

我需要澄清一件事。通过在两个项目中通过身份验证的login.html用户中使用上述signInUser()函数,我可以从login.html页面中的两个项目中获取数据。实际上,我需要在登录后在home.html页面中获取数据。但是在此显示当前用户为空。我也像上面一样在home.html页面中配置了两个项目。

请帮帮我。我在这一点上停了下来。我是Firebase的新手。

在Project-B中,数据库规则类似于

service cloud.firestore
{
  match /databases/{database}/documents
  {
    match /sample/ {AuthId=**}
    {
       allow read, write: if request.auth.uid != null;
    }
  }
}

谢谢。

1 个答案:

答案 0 :(得分:0)

我知道我迟到了,但这是为将来偶然发现此问题的任何人准备的。

在这种情况下,问题在于您混淆了两种不同的需求:需要对用户进行身份验证,以及需要访问不同系统上的资源。前者是用户之间的交互,而后者是两个系统之间的交互。不过,您使用的是同一组凭据。一个简单的解决方案是为系统到系统的通信创建一组凭据。这样您就可以在任何给定时间实例化对象以访问系统 B 上的资源,而无需依赖于用户凭据。