1

所以我对 node.js 和 faye 非常陌生 - 所以我认为这是非常基本的,但我不确定我应该问什么。

我为我的 faye 服务器设置了这个设置,在节点 jitsu 上运行:

var http = require('http'),
    faye = require('faye');

var bayeux = new faye.NodeAdapter({mount: '/faye', timeout: 45});

// Handle non-Bayeux requests
var server = http.createServer(function(request, response) {
  response.writeHead(200, {'Content-Type': 'text/plain'});
  response.write('Hello, non-Bayeux request');
  response.end();
});
bayeux.attach(server);
server.listen(8000);

var fayeToken = "myToken";

var serverAuth = {
  incoming: function(message, callback) {
    // Add an error if the tokens don't match
    if (fayeToken !== message.ext.auth_token)
        message.error = 'Invalid auth token';

      // Call the server back now we're done
      callback(message);
  }
};

bayeux.addExtension(serverAuth);

然后我有一个连接到它的 rails 应用程序。

在我添加 serverAuth 的东西之前,它工作正常。

当我像这样卷曲时:

curl http://myapp.jit.su/faye -d 'message={"channel":"/alerts", "data":"hello", "ext":{"auth_token":"myToken"}}'

我收到一条成功消息。

在 Rails 应用程序上的 JS 文件中,我有:

$(function() {
    //FAYE CLIENT
    var faye = new Faye.Client('http://myapp.jit.su/faye');
    faye.setHeader('ext.auth_token', 'myToken');
    faye.subscribe("/alerts", function(data) {
        alert(data);
    });
});

现在,当为 faye 脚本加载 rails 应用程序时,我收到一个错误的请求 400 错误。

发送的参数具体是:

[{"channel":"/meta/handshake","version":"1.0","supportedConnectionTypes":["callback-polling"],"id":"1"}]

因此,我设置的标头参数似乎没有在 faye 所做的“元”握手中发送。

在我进行此服务器身份验证之前,它工作得很好,我可以将消息卷曲到应用程序中。现在没有骰子。

有什么想法我哪里出错了吗?

谢谢!

4

2 回答 2

2

备查:

我必须确保它没有进行元调用:

var serverAuth = {
  incoming: function(message, callback) {
    // Let non-subscribe messages through
        if (message.channel.indexOf("/meta/") !== 0){
            if (fayeToken !== message.ext.auth_token){
                message.error = 'Invalid auth token';
            }
        }   
      callback(message);
  }
};
于 2012-05-16T02:11:19.143 回答
1

我可以在这里看到两个问题。首先,如果消息没有ext字段,您的扩展程序将失败。您应该在检查之前检查它message.ext.auth_token

var serverAuth = {
    incoming: function(message, callback) {
    // Let non-subscribe messages through
        if (message.channel.indexOf("/meta/") !== 0){
            if (!message.ext || fayeToken !== message.ext.auth_token){
                message.error = 'Invalid auth token';
            }
        }   
        callback(message);
    }
};

我也不确定您要验证什么。if (message.channel.indexOf("/meta/") !== 0)将匹配任何非元消息,即所有发送的消息publish()(元消息用于握手、轮询、(取消)订阅和断开连接)。这意味着任何人都可以发布消息,但只有服务器可以订阅任何频道。

其次,ext是消息本身的一部分,而setHeader()用于设置 HTTP 标头,即它是传输层的一部分。您应该使用扩展来添加ext消息:

client.addExtension({
    outgoing: function(message, callback) {
        message.ext = message.ext || {};
        message.ext.auth_token = THE_TOKEN;
        callback(message);
    }
});
于 2012-05-17T09:37:02.387 回答