从node.js服务器代表用户执行请求

时间:2015-02-03 16:25:38

标签: firebase

我正在尝试使用firebase作为我的持久层来实现node.js服务器。

用户可以登录并获取从客户身份验证firebase模块生成的accessToken。

然后,在每个将来的请求中,客户端将为服务器提供其给定的accessToken,然后服务器将通过连接到作为请求用户的firebase引用来执行操作。

    var ref = new Firebase("https://cexample.firebaseio.com/");
    ref.authWithCustomToken(token, function(error, authData) {
      ref.child("users").child(authData.uid).set({
        data: authData.uid,
        provider: "custom"
      });

    });

这种方法不起作用,因为firebase只为给定的firebase网址维护一次身份验证状态。

这意味着执行此代码:

    var ref = new Firebase("https://cexample.firebaseio.com/");
    ref.authWithCustomToken(token1, function(error, authData) {
      ref.child("users").child(authData.uid).set({
        data: authData.uid,
        provider: "custom"
      });

    });

    var ref1 = new Firebase("https://cexample.firebaseio.com/");
    ref1.authWithCustomToken(token2, function(error, authData) {
      ref.child("users").child(authData.uid).set({
        data: authData.uid,
        provider: "custom"
      });

    });

不起作用。只会调用第二个回调,即ref1之一。

无论如何能够从node.js服务器处理对firebase的请求,作为每个请求的不同用户吗?

1 个答案:

答案 0 :(得分:2)

您可以为要使用的每个单独的身份验证令牌生成子进程,但这不会非常有效:

// server.js
for (var i in users) {
    var user = users[i];
    var token = createTokenForUser(user);
    child_process.spawn("./single-user-worker.js", [token]);
}

// single-user-worker.js
var token = process.argv.pop();
var ref = new Firebase("https://cexample.firebaseio.com/");
ref.authWithCustomToken(token, ...);

为服务器创建一个高权限令牌以便为所有用户使用会更有效:

var token = createAdminToken();
var ref = new Firebase("https://cexample.firebaseio.com/");
ref.authWithCustomToken(token, function(error, authData) {
  for (var i in users) {
    var user = users[i];
    ref.child("users").child(user.uid).set({
      data: user.uid,
      provider: "custom"
    });
  }
});

node.js服务器是否为网页服务?客户可以直接联系Firebase吗?将自定义令牌发送到客户端供自己使用将是一个更正常的工作流程:

function (request, response) {
    var token = createTokenForUser(request.user);
    var script = ['<script>',
        'var token='+JSON.stringify(token)+';',
        'var ref= new Firebase(...);',
        'ref.authWithCustomToken(token, ...);',
        '</script>'].join("\n");
    response.end(script);
}

如果您对通常的方式不感兴趣,可以使用request之类的标准节点工具,使用auth中的自定义令牌调用Firebase REST API查询参数,如下:

var request = require("request");
var token = createTokenForUser(...);
var uid = ...;

request({
    method: "POST",
    url: "https://cexample.firebaseio.com/users/"+uid,
    qs: {auth: token},
    body: {
        data: uid,
        provider: "custom"
    },
    json: true
});

如果没有标准的Firebase库,很难对更改做出反应。您需要设置标头Accept: text/event-stream并为"data"事件编写处理程序,并确保在完成后关闭连接,这样就不会运行Firebase帐单。