Sails.js 对套接字请求的授权
Posted
技术标签:
【中文标题】Sails.js 对套接字请求的授权【英文标题】:Sails.js authorization for socket requests 【发布时间】:2013-08-17 06:54:41 【问题描述】:我正在尝试构建一个基于sails.js 的聊天应用程序。来自特定聊天的消息的 url 如下所示:
/api/chat/:id/messages
当我使用 XHR 请求此 url 时,它提供了一个会话 cookie,并且sails.js 构建了一个会话对象。我可以轻松检查用户权限以阅读特定聊天中的消息。
但是,我需要使用 socket.io 请求此 url,以便客户端可以订阅 messages
集合的所有未来更改。
当我使用 socket.io 请求此 url 时,没有设置会话 cookie,并且sails.js 会话为空。所以,我无法检查服务器端的用户权限。
我明白套接字请求不是 HTTP 请求。他们自己不提供任何cookies。
有什么简单的解决方法吗?
【问题讨论】:
澄清一下-您在跨域时遇到了这个问题,对吗?就像你在 www.foo.com 上嵌入一个脚本并打开一个到 www.bar.com 的套接字一样? 不,迈克——这不是跨域问题。我终于找到了答案并将其发布在下面。您必须以不同的方式访问您的套接字会话对象。附言也许你应该在sails.js 核心中实现这个解决方法。 【参考方案1】:您可以通过 socket.post() 而不是 XHR 进行初始登录,随后的套接字请求将被授权。
【讨论】:
【参考方案2】:我找到了一种方法来获取在 socket.io 握手时设置的会话对象。 在您的控制器中,您应该执行以下操作:
myControllerAction: function(req, res)
var session = req.session;
if (req.isSocket)
var handshake = req.socket.manager.handshaken[req.socket.id];
if (handshake)
session = handshake.session;
//session now contains proper session object
您可以在sails.js 策略中实现这一点,并将此策略附加到某些控制器。但是不要将您的套接字会话写入req.session
!否则,您将在尝试响应客户端时出错(原始req.session
仍以某种方式使用)。而是将其另存为 req.socketSession
或类似名称。
【讨论】:
【参考方案3】:alevkon,在上面提到的方法中,你必须在所有控制器中实现相同的,因为你不知道第一次访问哪个控制器......但是通过发送一个 jsonp 请求,你可以创建一个 cookie在客户端和服务器之间,在下一个会话之前使用相同的 cookie。
【讨论】:
Shiva,这不是 cookie 的问题。我在套接字握手之前已经发送了一些 AJAX 请求,所以sails.sid cookie 已经设置好了。问题不在于 cookie,问题在于如何从控制器访问会话对象。如果你的 req.isSocket 为真,你不会在你的 req.session 对象中找到合适的会话,但你仍然可以按照我描述的方式访问它。【参考方案4】:请在发送套接字请求之前从您的应用程序发送 JSONP 请求,这将创建一个 cookie 并接受套接字请求。
【讨论】:
这应该有什么帮助?在初始化 socket.io 握手之前我已经有一个 cookie。我应该使用 JSONP 请求什么地址?为什么选择 JSONP,而不是简单的 Ajax? 您能把您的错误粘贴在这里吗?您的客户端和服务器是否在同一个域中,请提供更多详细信息。 这个答案是团队其他成员和我过去所做的——澄清一下,听起来你正在做跨域套接字,是吗?问题是浏览器在建立 websocket 连接时不发送 cookie。不幸的是,您可能会发现 Safari 中仍然存在问题。 @alevkon 您将无法使用基本的 AJAX,因为它是跨域的——您需要使用 JSONP 或 CORS(并且不完全支持 CORS以上是关于Sails.js 对套接字请求的授权的主要内容,如果未能解决你的问题,请参考以下文章
使用node.js套接字客户端向sails.js(0.11.x)发出事件[重复]