Inner auth()似乎遵循外部auth()规则

时间:2013-05-07 11:01:33

标签: firebase firebase-security

在我们的应用程序中,我们使用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好/坏的部分,但我需要做的是代表用户写入一些受保护的位置,即使没有授权写入位置,但需要进行身份验证。

1 个答案:

答案 0 :(得分:3)

根据我从测试单元和经验中看到的内容,我不认为new Firebase实际上为您提供了与数据的独立连接。也就是说,这些都在内部连接到同一个Firebase实例(我认为):

var refA = new Firebase('...');
var refB = new Firebase('...');

因此,如果您想重新验证,我很确定您需要先调用unauth,这可能会影响您的testRef实例。

如果您确实需要同时使用不同的auth为数据库打开多个实例,那么您必须查看node-fibers或其他一些工作池模型,这将允许单独的连接。 / p>

但是,请考虑一下;你可能正在过度思考你的方法。如果您是代表没有权限的用户编写的,那么您实际上可能不需要以该用户身份进行身份验证。

我编写了一个完整的应用程序,其中包含第三方应用程序使用的安全Firebase组件,然后写回特权路径然后由用户读取,并且还没有遇到服务器所处的情况需要降级其权限才能执行此操作。

这并不是要假设我知道你的用例,只是为了给你一些鼓励来保持简单,因为试图兼顾身份验证并不简单。

我的方法是将Firebase安全规则视为最后防御 - 就像我的防火墙 - 而不是特权进程使用的编程算法的一部分。