Session Sails.js对套接字请求的授权
我正在尝试构建一个基于sails.js的聊天应用程序。来自特定聊天室的消息的url如下所示: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) {
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不完全支持