Получение пользователя из файла cookie экспресс-сессии.Паспорт, Экспресс-сессия, Socket.io - PullRequest
0 голосов
/ 19 января 2019

Мне нужно получить идентификатор сеанса из файла codified connect.sid. Мне нужно сделать это вне маршрута в моем файле server.js, чтобы проверить пользователя перед подключением его к запрошенным комнатам. Прямо сейчас печенье выглядит так:

cookie: 'io=YB0puaz8_Fr5RN4qAAAA; connect.sid=s%3Awew35upI6SzKaNbrmHlgJZPB3085Vcx9.OYZ014EDbjHVQK7u8qgkNvkDzzn5jhwi2HOjhfRVMqw'

Как я могу получить идентификатор пользователя с этого connect.sid? Это не похоже, что коллекция сессий хранит это. Это зашифрованный идентификатор пользователя, который хранится ? Если так, как я могу расшифровать это?

Я не уверен, должен ли я использовать cookie-парсер или нет для этого. Я перепробовал несколько функций, но похоже, что он в основном используется в качестве промежуточного программного обеспечения. Вы также можете заметить, что у меня есть app.use (session ({})) дважды. По какой-то причине, если я удаляю первый, я не могу войти в систему. Это довольно грязный код. Мои извинения.

Я храню сессии в Connect-Mongo. Вот мой server.js:

const mongoose = require('mongoose');
const session = require('express-session');
const passport = require('passport');
const MongoStore = require('connect-mongo')(session);
const SessionStorage = require('./models/Session');

//Middleware authentication function
const { ensureAuthenticated } = require('./config/auth');

const http = require('http');
const app = express();
const server = http.createServer(app);
const io = require('socket.io').listen(server);

//Passport Config
require('./config/passport')(passport);

//Load environment variables
require('dotenv').config();

//Database configuration
const db = process.env.DB;

//Connect to database
mongoose.connect(db, { useNewUrlParser: true })
    .then(() => console.log('MongoDB Connected...'))
    .catch(err => console.log(err));

//Bodyparser for incoming requests
app.use(express.urlencoded({ extended: true }));

// Express session
app.use(
  session({
    // store: new MongoStore({ mongooseConnection: mongoose.connection}),
    secret: process.env.SESSION_SECRET,
    resave: true,
    saveUninitialized: true,
    cookie: {
        path: '/',
        httpOnly: true,
        secure: false,
        maxAge: 10 * 60 * 1000
    },
    rolling: true
  })
);

const sessionMiddleware = session({
    store: new MongoStore({ mongooseConnection: mongoose.connection}),
    secret: process.env.SESSION_SECRET,
    resave: true,
    saveUninitialized: true,
    rolling: true,
    cookie: {
        path: '/',
        httpOnly: true,
        secure: false,
        maxAge: 10 * 60 * 1000
    }
});

// Passport middleware
app.use(passport.initialize());
app.use(passport.session());
app.use(sessionMiddleware);

io.use((socket, next) => {
    sessionMiddleware(socket.request, {}, next);
});

//Socket Integration
io.on('connection', socket => {    
    socket.use((packet, next) => {
        const handshake = socket.request;
        if (handshake.headers.cookie){
            //Sometimes session connect comes first but the pair will always be side by side
            const credentialsArr = handshake.headers.cookie.replace(";", '').replace(/\=/g,' ').split(" ");

            //Throwin that deuce into an object
            const credentials = {};
            let key = credentialsArr[0];
                credentials[key] = credentialsArr[1];

            //Sometimes theres only an io cookie and no session cookie
            //This prevents an entry in the credentials obj being 'undefined: undefined'
            if (credentialsArr.length > 2){
                key = credentialsArr[2];
                credentials[key] = credentialsArr[3];
            }

            //Make sure this session exists before hitting DB
            if (!credentials['connect.sid']) next(new Error('Please log in again.'));



        if (packet.sessioncookie) return next();

        next(new Error('Please log in.'))
    });

    socket.on('subscribe', room => {
        //TO DO
        //Make sure user is in requested group
        //Make sure group exists!

        socket.join(room);
        console.log(`User joined room: ${room}`);
    });    

    socket.on('disconnect', room => {
        socket.leave(room);
        console.log(`User diconnected`);
    });

    console.log('User connected!');
});


const PORT = process.env.PORT || 7575;

server.listen(PORT, console.log(`Server started on port ${PORT}`));```


...