跨域 Sails.js + Socket.io 授权

Posted

技术标签:

【中文标题】跨域 Sails.js + Socket.io 授权【英文标题】:Cross domain Sails.js + Socket.io authorization 【发布时间】:2014-03-10 00:07:11 【问题描述】:

我正在开发一个应用程序,该应用程序将push 内容传送到托管在不同域中的一组 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 应用程序中对用户进行身份验证,而不是直接在我的节点应用程序中进行身份验证。

【问题讨论】:

研究使用 redis 进行会话存储。我认为这将帮助您跨域。 确实,它可能会有所帮助,但我认为这在我的特定情况下没有,因为我无法访问每个应用程序的会话信息以共享身份或其他内容,如果这就是你的意思的话。或者你在想别的什么? websocket跨域是怎么打开的? 【参考方案1】:

我相信您的路线必须处理 CORS mate。示例:

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

当然你可以指定你接受的ip列表(然后替换'*')。

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

socket = io.connect(API.url);

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

$httpProvider.defaults.withCredentials = true

告诉我进展如何。

【讨论】:

以上是关于跨域 Sails.js + Socket.io 授权的主要内容,如果未能解决你的问题,请参考以下文章

将socket.io与sails js一起使用

Sails.js 与本机 WebSockets

使用node.js套接字客户端向sails.js(0.11.x)发出事件[重复]

使用 Socket.IO 和 NodeJS 实现音频聊天

Socket.IO 中的跨域连接

socket.io 跨域请求被阻止