Session Sails.js对套接字请求的授权

Session Sails.js对套接字请求的授权,session,express,socket.io,session-cookies,sails.js,Session,Express,Socket.io,Session Cookies,Sails.js,我正在尝试构建一个基于sails.js的聊天应用程序。来自特定聊天室的消息的url如下所示: myControllerAction: function(req, res) { var session = req.session; if (req.isSocket) { var handshake = req.socket.manager.handshaken[req.socket.id]; if (handshake) {

我正在尝试构建一个基于sails.js的聊天应用程序。来自特定聊天室的消息的url如下所示:

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
}
/api/chat/:id/messages

当我用XHR请求这个url时,它提供了一个会话cookie,sails.js构建了一个会话对象。我可以轻松地检查用户权限,以读取特定聊天室中的消息

但是,我需要使用socket.io请求此url,以便客户端可以订阅
消息
集合的所有未来更改

当我使用socket.io请求此url时,没有设置会话cookie,sails.js会话为空。因此,我无法检查服务器端的用户权限

我知道套接字请求不是HTTP请求。他们自己不提供任何饼干


有什么简单的解决办法吗

在发送套接字请求之前,请先从应用程序发送JSONP请求,该请求将创建cookie并接受套接字请求。

我找到了一种方法来获取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
或类似的内容。

alevkon,在上述方法中,您必须在所有控制器中实现相同的功能,因为您不知道第一次访问哪个控制器……但只发送一个jsonp请求,就可以在客户端和服务器之间创建cookie,相同的cookie将一直使用到下一个会话。

您可以通过套接字进行初始登录。post()而不是XHR,随后的套接字请求将被授权

这会有什么帮助?在初始化socket.io握手之前,我已经有了一个cookie。我应该向JSONP请求什么地址?为什么是JSONP,而不是简单的Ajax?你能把你的错误粘贴到这里吗?如果你的客户端和服务器在同一个域中,请提供更多的细节。这个答案是团队的其他成员和我过去所做的——澄清一下,听起来你在跨域进行套接字操作,是吗?问题是浏览器在建立websocket连接时不发送cookie。不幸的是,您可能会发现Safari中仍然存在问题@alevkon您将无法使用基本AJAX,因为它是跨域的--您需要使用JSONP或CORS(CORS不完全支持