Nach einer erfolgreichen Authentifizierung eines Benutzers, dann ist es die Sitzungsdaten in einem Zugriffstoken codiert und dann der folgende Code verwendet wird, um das Cookie zu setzen:Express und Socket.IO geteilt Cookies
res.set('Set-Cookie', cookie.serialize('access_token', token, {
httpOnly: true,
maxAge: 60 * 60 * 24 * 7 // 1 week
}));
Später wurde die Benutzer versucht, eine Verbindung herzustellen socket.io
und der Server versucht, den Cookie-Daten abzurufen:
io.on('connection', function(socket) {
console.log("SOCKET CONNECTED");
console.log(socket.handshake.headers.cookie);
console.log(socket.request.headers.cookie);
});
Ausgabe
SOCKET CONNECTED
io=Y8-CmNDnIH1eOx0_AAAA
io=Y8-CmNDnIH1eOx0_AAAA
Wie Sie sehen, enthält das Cookie nur eine Eigenschaft mit dem Namen io
, aber nicht access_token
. Wenn die Cookies jedoch auf ausdrückliche Anfrage gelesen werden, enthalten sie das Token und die Werte sind korrekt.
Warum sind die Cookie-Header, die auf ausdrückliche Anfrage gesetzt sind, anders als die auf socket.io. Wie teile ich Cookies zwischen socket.io und express?
Sind Sie 100% sicher, dass der Cookie gesetzt wurde, bevor die socket.io-Verbindung erstellt wurde? Siehst du den Cookie bei anderen ausdrücklichen Anfragen, um zu beweisen, dass er da ist? – jfriend00
FYI, Sie können 'res.cookie()' verwenden, um den Cookie zu setzen, da dieser in Express eingebaut ist. – jfriend00
Denken Sie daran, dass 'socket.handshake.headers.cookie' eine Momentaufnahme der Cookies zu dem Zeitpunkt ist, an dem die Verbindung socket.io ursprünglich hergestellt wurde. Es ist nicht der aktuelle Wert der Cookies, den eine neue http-Anfrage sehen würde. Daher muss Ihr Cookie gesetzt werden, bevor die socket.io Verbindung hergestellt wird, um sie dort zu sehen. – jfriend00