'Send cookies with socket.io-client
I am trying to connect to a websocket. I would like to add cookies from the actual website login, so the server (which is NOT mine), knows who I am (events are account specific).
var opts = {
extraHeaders: {
'Cookie': "_ga=GA1.2.17432343994.1475611967; _gat=1; __cfduid=dc232334gwdsd23434542342342342475611928"
},
}
function socket() {
var socket = io(websiteURL, opts);
var patch = require('socketio-wildcard')(io.Manager); patch(socket);
socket.on('connect', function () {
console.log(" > [Connected]");
});
socket.on('*', function (data) {
console.log(" >>> " + data);
});
socket.on('disconnect', function () {
console.log(" > [Disconnected]");
});
}
The connection itself works fine, since I am receiving the public events from the website (not per-account ones).
I tried to find the problem using node-inspector.
This is the first request that is being done. It seems like the request headers are empty and the cookies are missing from there.
Normal usage of the website in chrome:
(Yes, I am sending less cookies in node, just to see if they pop up in the request cookies)
Am I doing something wrong? How would I add cookies the right way?
Solution 1:[1]
I had a similar problem, I think your options have to set the cookie for the "polling" transport method, like this:
var opts = {
transportOptions: {
polling: {
extraHeaders: {
'Cookie': '_ga=GA1.2.17432343994.1475611967; _gat=1; __cfduid=dc232334gwdsd23434542342342342475611928'
}
}
}
}
I got this to work with the following all-in-one server-client example:
const express = require('express');
const http = require('http');
const app = express();
const httpServer = new http.Server(app);
const socketServer = require('socket.io')(httpServer);
const LISTEN_PORT = 4444;
socketServer.on('connection', socket => {
const cookieString = socket.handshake.headers.cookie;
console.log('server connection ' + (cookieString || ''));
setInterval(() => socket.emit('ping', Date.now()), 1000);
});
let socketClient = undefined;
httpServer.listen(LISTEN_PORT, 'localhost', () => {
console.log('web server started')
const options = {
transportOptions: {
polling: {
extraHeaders: {
'Cookie': 'hello=world'
}
}
}
}
socketClient = require('socket.io-client').connect('http://localhost:'+LISTEN_PORT, options);
socketClient.on('ping', (data) => console.log('ping ' + data));
});
Solution 2:[2]
Socket.io recently added an extraHeaders
option to the client:
Client(url, {
extraHeaders: {
Cookie: `CookieName=CookieValue;`,
},
})
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | m0tive |
Solution 2 | theob |