Nodejs求教!我这个socket.io怎么获取不到cookie呢

Nodejs求教!我这个socket.io怎么获取不到cookie呢

    var io = socketio.listen(server);
//
/set io/
io.set(‘log level’, 1);
io.set(‘authorization’, function(handshakeData, callback) {
console.log(“handshakeData是:”);
console.log(handshakeData);
if (!handshakeData.headers.cookie) {
console.log(“socket.io没有发现cookie”);//here,会提示没有发现cookie。。。
//return callback(‘socket.io: no found cookie.’, false);
}else{
var signedCookies = require(‘express/node_modules/cookie’).parse(handshakeData.headers.cookie);
handshakeData.cookies = require(‘express/node_modules/connect/lib/utils’).parseSignedCookies(signedCookies,“ICU”);
console.log(“获取到的用户cookie是:”);
console.log(handshakeData.cookies);
//
}
});


3 回复

要解决Node.js中使用Socket.IO时无法获取到cookie的问题,需要确保客户端在连接Socket.IO时正确地传递了cookie。以下是一个详细的解决方案,包括示例代码和解释。

解释

在Socket.IO中,默认情况下,客户端发送的HTTP请求(用于建立WebSocket连接)不会包含cookie。因此,我们需要手动设置cookie,或者在客户端明确地将cookie添加到请求头中。

示例代码

客户端代码

首先,确保客户端在发起Socket.IO连接时包含了cookie。这可以通过设置extraHeaders来实现:

var socket = io.connect('http://yourserver.com', {
    extraHeaders: {
        Cookie: document.cookie
    }
});

这里的document.cookie是从浏览器获取当前页面的所有cookie。

服务器端代码

接下来,在服务器端配置Socket.IO以正确处理这些cookie。以下是修改后的服务器端代码:

var express = require('express');
var app = express();
var server = require('http').Server(app);
var io = require('socket.io')(server);

app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(express.cookieParser());

// 设置日志级别和授权
io.set('log level', 1);
io.set('authorization', function(handshakeData, accept) {
    console.log("handshakeData是:");
    console.log(handshakeData);

    // 检查是否提供了Cookie头
    if (!handshakeData.headers.cookie) {
        console.log("socket.io没有发现cookie");
        return accept('socket.io: no found cookie.', false);
    }

    // 解析cookie
    var signedCookies = require('cookie').parse(handshakeData.headers.cookie);
    handshakeData.signedCookies = require('connect').utils.parseSignedCookies(signedCookies, "ICU");

    console.log("获取到的用户cookie是:");
    console.log(handshakeData.signedCookies);

    // 接受连接
    return accept(null, true);
});

server.listen(3000, function() {
    console.log('Server listening on port 3000');
});

注意事项

  1. 确保依赖项安装:确保你的项目中已经安装了必要的依赖包,如expresscookie
  2. 检查cookie值:确保从客户端传递过来的cookie格式正确且未被篡改。
  3. 安全性:不要在生产环境中直接使用示例中的简单验证逻辑。应该使用更安全的方式处理身份验证和授权。

通过以上步骤,你应该能够成功地在Socket.IO连接中获取到cookie。


提供你的socket.io版本的话别人也会更有针对性的回答你的问题的啊~ pre2 版本里, 可以这样获取

var io = require('socket.io')();
  io.use(function(socket, next){
    if (socket.request.headers.cookie) return next();
    next(new Error('Authentication error'));
  });

也就是说0.9.* 版本里的 socket.handshake 现在已经废弃掉, 换成了 socket.request 来做握手data的引用~ 参考:https://github.com/LearnBoost/socket.io/issues/1510

从你提供的代码来看,问题可能出在 handshakeData.headers.cookie 没有正确传递。通常情况下,客户端发起的 WebSocket 连接不会自动带上 HTTP Cookie。你需要在客户端显式地将 Cookie 附加到 WebSocket 连接中。

以下是一个示例代码,展示如何在客户端发送 WebSocket 连接时带上 Cookie:

客户端代码

const socket = new WebSocket('ws://yourserver.com/socket.io/?EIO=3&transport=websocket');
socket.onopen = () => {
    const cookies = document.cookie;
    socket.send(JSON.stringify({type: 'cookie', data: cookies}));
};

socket.onmessage = (event) => {
    console.log('Server:', event.data);
};

服务器端代码

var io = require('socket.io')(server);
var cookie = require('cookie');

io.use(function(socket, next) {
    const handshakeData = socket.request;
    
    // 从自定义消息中提取 Cookie
    handshakeData.on('message', function(message) {
        const data = JSON.parse(message.data);
        
        if (data.type === 'cookie') {
            handshakeData.headers.cookie = data.data;
            next();
        }
    });
});

io.on('connection', function(socket) {
    console.log('Client connected');
    
    socket.on('disconnect', function() {
        console.log('Client disconnected');
    });
});

解释

  1. 客户端:在 WebSocket 连接打开后,将当前页面的 Cookie 发送到服务器。
  2. 服务器:监听来自客户端的消息,并从中提取 Cookie。然后将其添加到 handshakeData.headers.cookie 中,以便后续处理。

这样可以确保在 WebSocket 连接时能够获取到 Cookie。

回到顶部