我正在尝试使用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的请求,作为每个请求的不同用户吗?
答案 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帐单。