0

在我们的应用程序中,我们使用 Firebase 的自定义登录功能将一些元数据存储在用户的身份验证令牌中。

稍后,我们将此令牌发送到我们的一个 Web 应用程序,以使用新的管理令牌禁用安全规则来代表用户执行任务。这个想法是,经过身份验证的用户不能直接写入特定位置,但在完成一些服务器端计算和验证后,可以将数据写入该位置。

这是我正在尝试做的示例代码:

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

当期望的行为是能够使用管理员令牌在该位置写入时。

我知道这可能不是 Firebase 问题,而是一些 JavaScript 好/坏部分,但我需要做的是代表用户在某个受保护的位置写入,即使该用户无权在该位置写入,但是需要进行身份验证。

4

1 回答 1

3

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

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

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

如果您确实需要同时使用不同的身份验证向数据库打开多个实例,那么您将不得不查看node-fibers或其他一些允许单独连接的工作池模型。

但是,请考虑一下;你可能想多了你的方法。如果您代表没有权限的用户写作,那么您实际上可能不需要作为该用户进行身份验证。

我已经编写了一个完整的应用程序,其中包含由第三方应用程序使用的安全 Firebase 组件,然后写回特权路径,然后由用户读取,并且还没有遇到服务器需要降级的情况它的权限这样做。

这并不意味着假设我知道您的用例,只是为了鼓励您保持简单,因为尝试兼顾身份验证并不简单。

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

于 2013-05-07T15:31:44.717 回答