Мне нужно получить идентификатор сеанса из файла 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}`));```