如何在 NodeJS 上访问 socket.io 中的 cookie 会话中间件?

问题描述 投票:0回答:3

我决定在我的应用程序中使用 socket.io 并偶然发现了一个问题。我使用

cookie-session
进行明确授权:

var session = require('cookie-session');
var app = express();
// ...
app.use(session({
  keys: ['secretkey1', 'secretkey2']
}))
// ...
app.get('/settings', function(req, res) {
    res.type("html");

    if (!req.session.sid)    {
        console.log("NO SID");
        req.session.sid = util.randomString();
    }
    else {
        console.log("sid:" + req.session.sid);
    }

    // doing stuff with req.session.sid

    var jadeView = { /*...*/ };
    res.status(200).send(mainJade(jadeView));
});

现在我使用socket.io。我想出了如何访问 cookie:

io.sockets.on('connection', function(socket) {
    var cookie_string = socket.request.headers.cookie;
    console.log("cookies: " + cookie_string);
// ...
}

但是如何将

cookie_string
转换为会话对象,就像
req.session
中那样?

node.js session cookies express socket.io
3个回答
5
投票

改变了什么

@rmflow 2014 年的答案似乎不适用于 2017 年的 socket.io-client 2.0.2 和 cookie-session 2.0.0

显然,cookies包(cookie-session的主要依赖项)期望一些不同的请求和响应对象。也就是说,请求对象应该有一个带有布尔值

connection
属性的
encrypted
对象;此外,响应对象预计具有
getHeader
setHeader
方法。

更新解决方案

const session = require('cookie-session')({
    name: 'some-session-name',
    secret: 'some-session-secret', // or an array of keys as usual
    ... // Other relevant options
});

io.on('connection', socket => {
    let cookieString = socket.request.headers.cookie;

    let req = {connection: {encrypted: false}, headers: {cookie: cookieString}}
    let res = {getHeader: () =>{}, setHeader: () => {}};
    //
    session(req, res, () => {
        console.log(req.session); // Do something with req.session
    })
})

2
投票

我自己发现了:

var req = { headers : {cookie : cookie_string} }
session({ keys: ['secretkey1', 'secretkey2'] })(req, {}, function(){})
console.log(req.session.sid);

0
投票

2024 年更新。两者都不适合我。我实现了一个套接字中间件等等。

导入和设置:

import cookieSession from "cookie-session";
const session = cookieSession();

app.use(session);

const io = new Server(server)

中间件:

io.use((socket, next) => {
  let req = {
    headers: { cookie: socket.request.headers.cookie },
  };
  session(req, {}, () => {
    socket.session = req.session;
    next();
  });
});

现在套接字有一个

session
:

io.on("connection", (socket) => {
  console.log("We have a session!", socket.session);
});

注意:这仅在传递标头时有效(本质上仅在第一次连接期间),因此当会话更改时,这些更改不会传播到套接字对象。

© www.soinside.com 2019 - 2024. All rights reserved.