2014-02-11 46 views
5

我在它提供内容中的一组不同的域托管的Web应用程序的应用工作。我使用Sails.js和Socket.io,并且它的结构是这样的:跨域Sails.js + Socket.io授权

的客户端脚本,每个Web应用程序的客户端浏览器中运行,是这样的:

socket.on('customEvent', function(message){ 
    //do something with message on event trigger 
} 

然后,在服务器,事件'customEvent'在需要时发出,并且它可以工作(例如,在onConnect事件:sails.io.emit('customEvent',{message ...})。

但我面临一个问题,当谈到处理授权。我已经试过第一种方法是基于Cookie的身份验证,作为解释here(通过改变api/config/sockets.js功能authorizeAttemptedSocketConnection),但它不是生产一个适当的解决方案,它不是在浏览器中有更严格的Cookie政策支持(由于他们默认禁止使用第三方cookie)。

我的问题是:如何实现使用sails.js适当的跨浏览器和跨域授权机制,可以在socket.io的授权过程的支持?

======

更多细节:

  • 我还尝试添加的登录用的公知的OAuth提供商(例如Facebook),采用this example的位置。我有Passport会话,但我仍然无法从客户端脚本进行身份验证(它只能在由我的节点应用程序直接托管的页面中)。
  • JSONP请求获得会话可能是一个解决方案,但它并没有在Safari工作。另外我更喜欢用户在其中一个Web应用程序中进行身份验证,而不是直接在我的节点应用程序中进行身份验证。
+0

使用redis进行会话存储..这将帮助你跨域我想。 – gorelative

+0

确实如此,它可能会有所帮助,但我认为这不是我个人的情况,因为我无法访问每个应用程序的会话信息以共享身份或其他内容,如果这就是您的意思。或者你在想什么? – jpgc

+0

你如何打开websocket跨域? – Luc

回答

0

我相信你的路由必须处理CORS伴侣。例如:

'/auth/logout': { 
    controller: 'AuthController', 
    action: 'logout', 
    cors: '*' 
}, 

当然,你可以指定IP列表中选择您正在接受(再更换'*')。

值得mentionning,你必须指定socket.io具有连接(前端JS):

socket = io.connect(API.url); 

对于任何普通的HTTP GET/PUT/POST/DELETE,请确保您的AJAX信封凭证(cookie)。例如角:

$httpProvider.defaults.withCredentials = true 

让我知道它是怎么回事。