Sails.js授权套接字请求

时间:2013-08-15 05:09:26

标签: session express socket.io session-cookies sails.js

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

/api/chat/:id/messages

当我使用XHR请求此URL时,它提供会话cookie并且sails.js构建会话对象。我可以轻松检查用户权限,以便从特定聊天中读取消息。

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

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

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

有没有简单的解决方法?

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

请在发送套接字请求之前从您的应用程序发送JSONP请求,这将创建一个cookie并接受套接字请求。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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