我正在开发一个网站。我将网站托管到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;
}
}
}
谢谢。
答案 0 :(得分:0)
我知道我迟到了,但这是为将来偶然发现此问题的任何人准备的。
在这种情况下,问题在于您混淆了两种不同的需求:需要对用户进行身份验证,以及需要访问不同系统上的资源。前者是用户之间的交互,而后者是两个系统之间的交互。不过,您使用的是同一组凭据。一个简单的解决方案是为系统到系统的通信创建一组凭据。这样您就可以在任何给定时间实例化对象以访问系统 B 上的资源,而无需依赖于用户凭据。