我构建与各种平台客户端交互的Rails API。在服务器端有一个faye服务器实现,类似于:
Faye::RackAdapter.new(:mount => '/faye', :timeout => 25)
在服务器端,我想通过令牌添加身份验证。我使用faye扩展名:
class ServerAuth
def incoming(message, callback)
# Let non-subscribe messages throughs
unless message['channel'] == '/meta/subscribe'
return callback.call(message)
end
# Get subscribed channel and auth token
msg_token = message['ext'] && message['ext']['authToken']
# Add an error if the tokens don't match
if msg_token != '12345'
message['error'] = 'Invalid subscription auth token'
end
# Call the server back now we're done
callback.call(message)
end
end
实际上它不像我想象的那样工作。当客户端传递正确的令牌时,一切似乎都是正确的,但是当他传递无效的令牌时,他仍然能够推送消息,即使他从服务器得到错误消息。我应该如何阻止这样的消息,客户端不会接收它们(显然是在服务器端)。
我找到了解决问题的方法。这是因为我只验证了"/meta/subscribe",而不是客户端发布消息的其他通道。现在,发布消息的第二个扩展方法应该如下所示:
def incoming(message, callback)
return callback.call(message) if message['channel'].start_with? '/meta/'
<here all logic>
end