跨域 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 授权的主要内容,如果未能解决你的问题,请参考以下文章