跨域Sails.js + Socket.io授权

时间:2014-02-11 22:49:34

标签: node.js socket.io cross-domain authorization sails.js

我正在使用一个应用程序,它将推送内容提供给托管在不同域中的一组Web应用程序。我正在使用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的授权过程中得到支持?

==

更多详情:

  • 我还尝试使用this example作为基础,向着名的oauth提供商(例如facebook)添加登录信息。我有Passport会话,但我仍然无法通过客户端脚本进行身份验证(它只适用于我的节点应用程序直接托管的页面)。
  • 获取会话的JSONP请求可能是一个解决方案,但它在Safari中无法正常工作。此外,我更喜欢用户在其中一个Web应用程序中进行身份验证,而不是直接在我的节点应用程序中进行身份验证。

1 个答案:

答案 0 :(得分:0)

我相信你的路线必须处理CORS队友。例如:

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

当然,您可以指定您正在接受的IP列表(然后替换'*')。

值得一提的是你必须指定socket.io必须连接的位置(前端JS):

socket = io.connect(API.url);

对于任何常见的http GET / PUT / POST / DELETE,请确保您的ajax信封附带凭据(cookie)。例如,使用angular:

$httpProvider.defaults.withCredentials = true

让我知道它是怎么回事。