我正在使用faye消息系统,我想添加身份验证!我在网站上工作并按照教程进行操作。
在客户端上,我有一个外发消息的扩展名:
var droneFaye = new faye.Client("/faye", {
timeout: 120
});
var USER_TOKEN = 'ifd63cylqwsyaq9c2ptzywjujgtfpxs';
droneFaye.addExtension({
outgoing: function(message, callback) {
if (message.channel !== '/meta/subscribe')
return callback(message);
message.ext = message.ext || {};
message.ext.token = USER_TOKEN;
console.log(message);
callback(message);
}
});
在服务器上:
var token = 'ifd63cylqwsyaq9c2ptzywjujgtfpxs'
var serverAuth = {
incoming: function(message, callback) {
// Let non-subscribe messages through
if (message.channel !== '/meta/subscribe')
return callback(message);
// Get subscribed channel and auth token
var msgToken = message.ext && message.ext.token;
// Find the right token for the channel
if (token !== msgToken) {
message.error = 'Invalid subscription auth token';
}
console.log(message);
callback(message);
}
};
var adapter = new faye.NodeAdapter({
mount:'/faye',
timeout:45
});
adapter.addExtension(serverAuth);
adapter.attach(httpServer);
我在服务器上订阅了这样的内容:
adapter.getClient().subscribe("/drone/move", function(cmd) {});
好的!因此,当我启动服务器并且没有客户端时,它已经调用了订阅的扩展名,它将在控制台上输出:
{ channel: '/meta/subscribe',
clientId: '2isdeb0ds77zl0lh82ob1kqu29y1cajnv80',
subscription: '/drone/move',
id: '2',
error: 'Invalid subscription auth token' }
一旦客户端连接到服务器,它将再次调用扩展,它将输出:
{ channel: '/meta/subscribe',
clientId: '3kechs0c7smpc05z5o7d0a8qcd301d8zi41',
subscription: '/drone/move',
id: '3',
ext: { userId: 18787, token: 'ifd63cylqwsyaq9c2ptzywjujgtfpxs' } }
所以这看起来不错!但是,即使它们具有正确的令牌并且没有错误消息,也不会有其他消息到达服务器上!
仅供参考。如果你向消息对象添加一个带有值的错误键,它就不会将消息传递给它的订阅......它应该是那样的!...
此外,当我在扩展程序中注释掉message.error时,它工作正常,但当然没有身份验证。
所以有人知道为什么服务器调用扩展名,即使没有客户端,第二个为什么即使消息对象中没有错误,faye也不会将消息提供给它的订阅?
THX!
答案 0 :(得分:0)
还提出了问题,answered here:
这是由对
adapter.getClient().subscribe()
的调用引起的。[...]服务器端客户端(
<adapter>.getClient()
)返回与服务器的连接,因此会像客户端一样遍历相同的扩展(传入,传出)。[...]附加传出扩展名,您将看到它正在响应服务器客户端。