Javascript Socket.io身份验证情况

Javascript Socket.io身份验证情况,javascript,sockets,cookies,express,socket.io,Javascript,Sockets,Cookies,Express,Socket.io,我正在将Socket.io用于Express 4 io有一些中间件,允许您在注册连接事件之前对套接字请求进行身份验证 我遇到的问题是没有定义socket.request.cookies。所以我注册的错误是“没有传输cookie”,正如您在下面看到的 这方面的新中间件如下所示: io.use(function (socket, next) { var handshakeData = socket.request; //v

我正在将Socket.io用于Express 4

io有一些中间件,允许您在注册连接事件之前对套接字请求进行身份验证

我遇到的问题是没有定义socket.request.cookies。所以我注册的错误是“没有传输cookie”,正如您在下面看到的

这方面的新中间件如下所示:

       io.use(function (socket, next) {
                var handshakeData = socket.request;
                //var handshakeData = socket.handshake || socket.request;

                if (handshakeData.headers.cookie && handshakeData.cookie) {

                    handshakeData.cookie = cookie.parse(handshakeData.headers.cookie);

                    handshakeData.sessionID = cookie.parse(handshakeData.cookie['express.sid'], 'foo'); //pass session secret at end

                    if (handshakeData.cookie['express.sid'] == handshakeData.sessionID) {
                        return next(new Error('Cookie is invalid.'), false);
                    }

                } else {
                    return next(new Error('No cookie transmitted.'), false); //I am failing here
                }

                return next(null, true);

            });

正如我所说,问题是handshakeData.cookie=socket.handshake.cookie是未定义的。我认为需要定义此值,以便身份验证能够正确工作。知道可能有什么问题吗?

请参阅,谢谢,我已经让它工作了,但是由于某些原因,socket.io的会话id与Express httpa的会话id不匹配。您是否通过socket.io看到与通过常规HTTP请求相同的cookie值。从记录这些开始。还有原因:
if(handshakeData.headers.cookie&&handshakeData.cookie){
?您似乎要求
cookie
属性存在于两个地方。谢谢,您可以忘记上面的代码。剩下的唯一问题是express和socket.io之间的会话ID不匹配。我可以在Chrome中的resources/cookies下看到浏览器cookie。我假设express和socket.io都使用相同的cookie值,因此我看不出会话ID如何不匹配。您的服务器代码正在创建会话并设置cookie以指示会话ID。您希望看到的是,web服务器和socket.io代码是否都看到完全相同的会话ID。如果是,则问题出在会话查找代码中的某个地方(相同的sessionID会导致不同的会话)。如果不是,则问题出在处理会话cookie的代码中的某个地方。如果cookie中的sessionID没有问题,并且socket.io代码具有正确的sessionID,则问题一定出在使用sessionID并将其与实际会话关联的服务器端代码中。