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