我得到permission_denied当我试图读取用户映射数据与"身份验证密码",但我能够阅读,如果我与我的领英登录。我想知道我做错了什么?
这是我的数据和规则结构:
//Firebase Data
user-mappings: {
linkedin: {
MyLikedinID: {
user: {
uid: "simplelogin:1"
}
}
}
}
//Firebase Rules
"user-mappings": {
"linkedin": {
"$linkedin_uid": {
".read": "auth !== null && (
(auth.provider === 'linkedin' && auth.id === $linkedin_uid) ||
(auth.uid === data.child('user/uid').val())
)",
".write": "true"
}
}
}
基本上,当我用电子邮件和密码登录时,我试图访问"用户映射/linkedin/$linkedin_uid"数据。
我的代码是:
//Login
auth.$authWithPassword(user).then(function(authDataResult) {
//Some code here
}).catch(function(error) {
//Some code here
});
//Get user-mappings
var objRef = self.getRef('/user-mappings/linkedin/MyLinkedinID');
var obj = $firebaseObject(objRef);
obj.$loaded().then(function(data) {
//When I do this, I gor the permission_denied error
});
这仍然不完全清楚,但我的猜测是您试图在用户身份验证之前加载数据。如果是这种情况,通常通过添加一些日志记录来查看发生了什么是最容易的:
//Login
console.log('starting auth');
auth.$authWithPassword(user).then(function(authDataResult) {
console.log('authenticated');
//Some code here
}).catch(function(error) {
//Some code here
});
//Get user-mappings
console.log('getting user mappings');
var objRef = self.getRef('/user-mappings/linkedin/MyLinkedinID');
var obj = $firebaseObject(objRef);
obj.$loaded().then(function(data) {
console.log('user mappings gotten');
//When I do this, I got the permission_denied error
});
如果我猜对了,你的输出将是这个顺序:
starting auth
getting user mappings
user mappings gotten
authenticated
因此,在用户身份验证完成之前就开始加载用户映射。这是因为用户身份验证以异步方式进行。
要解决这个问题,你应该将任何需要用户身份验证的代码移到承诺中,当用户身份验证完成时解决:
//Login
console.log('starting auth');
auth.$authWithPassword(user).then(function(authDataResult) {
console.log('authenticated');
//Get user-mappings
console.log('getting user mappings');
var objRef = self.getRef('/user-mappings/linkedin/MyLinkedinID');
var obj = $firebaseObject(objRef);
obj.$loaded().then(function(data) {
console.log('user mappings gotten');
//When I do this, I got the permission_denied error
});
//Some code here
}).catch(function(error) {
//Some code here
});