在Node.js上使用Faye进行服务器authentication

所以我对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); 

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

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

当我curl如此:

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

我收到一个成功的消息。

在我的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); }); }); 

现在,当rails应用程序加载faye脚本时,遇到错误的请求400错误。

所发送的参数具体是:

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

所以看起来好像我设置的标题参数不是在这个faye这个“meta”握手中发送的。

在我有这个服务器authentication之前,它工作得很好,我可以消息进入应用程序。 现在没有骰子。

任何想法,我要去错了?

谢谢!

备查:

我不得不确定它没有进行元调用:

 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); } }; 

这里有两个问题,我可以在这里看到。 首先,如果邮件没有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); } }; 

我也不确定你想要进行身份validation。 if (message.channel.indexOf("/meta/") !== 0)将匹配任何非元消息,即所有使用publish()发送的消息(元消息用于握手,轮询,(un)订阅,和断开连接)。 这意味着任何人都可以发布消息,但只有服务器可以订阅任何渠道。

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

 client.addExtension({ outgoing: function(message, callback) { message.ext = message.ext || {}; message.ext.auth_token = THE_TOKEN; callback(message); } });