【问题标题】:Cross domain Sails.js + Socket.io authorization跨域 Sails.js + Socket.io 授权
【发布时间】: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跨域是怎么打开的?

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


【解决方案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

告诉我进展如何。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-30
    • 2015-04-10
    • 2013-03-23
    • 2012-03-22
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多