在我们的应用程序中,我们使用Firebase的自定义登录功能将一些元数据存储在用户的身份验证令牌中。
稍后,我们会将此令牌发送到我们的某个Web应用程序,以代表用户使用新的 admin 令牌执行任务,以禁用安全规则。我们的想法是,特定位置不能由经过身份验证的用户直接写入,但在完成某些服务器端计算和验证后,可以在该位置写入数据。
以下是我正在尝试做的示例代码:
var testRef = new Firebase(firebaseApp + 'test');
testRef.auth(userFirebaseAuthToken, function(error, result) {
if (!error) {
var userId = result.auth.userId;
// perform validations and calculations
var tokenGenerator = new FirebaseTokenGenerator(firebaseSecret);
var token = tokenGenerator.createToken({admin: true});
var protectedRef = new Firebase(firebaseApp + '/protected/');
protectedRef.auth(token, function(error) {
if (!error) {
protectedRef.child('foo').push({id: userId});
}
});
}
});
但是我收到了这个错误:
FIREBASE WARNING: set at /protected/foo/-Ityb1F6_G9ZrGCvMtX- failed: permission_denied
如果需要的行为是能够使用 admin 令牌在该位置书写。
我知道这可能不是Firebase问题,而是一些JavaScript好/坏的部分,但我需要做的是代表用户写入一些受保护的位置,即使没有授权写入位置,但需要进行身份验证。
答案 0 :(得分:3)
根据我从测试单元和经验中看到的内容,我不认为new Firebase
实际上为您提供了与数据的独立连接。也就是说,这些都在内部连接到同一个Firebase实例(我认为):
var refA = new Firebase('...');
var refB = new Firebase('...');
因此,如果您想重新验证,我很确定您需要先调用unauth,这可能会影响您的testRef
实例。
如果您确实需要同时使用不同的auth为数据库打开多个实例,那么您必须查看node-fibers或其他一些工作池模型,这将允许单独的连接。 / p>
但是,请考虑一下;你可能正在过度思考你的方法。如果您是代表没有权限的用户编写的,那么您实际上可能不需要以该用户身份进行身份验证。
我编写了一个完整的应用程序,其中包含第三方应用程序使用的安全Firebase组件,然后写回特权路径然后由用户读取,并且还没有遇到服务器所处的情况需要降级其权限才能执行此操作。
这并不是要假设我知道你的用例,只是为了给你一些鼓励来保持简单,因为试图兼顾身份验证并不简单。
我的方法是将Firebase安全规则视为最后防御 - 就像我的防火墙 - 而不是特权进程使用的编程算法的一部分。