Создать сеанс mongoDB только с подключением Socket.io - PullRequest
1 голос
/ 21 апреля 2020

Мне нужно создать сеанс на MongoDB при запуске соединения с сокетом, у меня есть следующий код:

var express = require('express');
var session = require('express-session');
var sharedsession = require("express-socket.io-session");

var MongoDBStore = require('connect-mongodb-session')(session);

var app = express();
var http = require('http').createServer(app);
var io = require('socket.io')(http);


var store = new MongoDBStore({
  uri: 'CONNECTION TO MONGODB',
  collection: 'sessions',
    connectionOptions: { 
    useNewUrlParser: true
  }
});

// Catch errors
store.on('error', function(error) {
  console.log(error);
});

let sessionConfig = require('express-session')({
  secret: 'This is a secret',
  cookie: {
    maxAge: 1000 * 60 * 60 * 24 * 7 // 1 week
  },
  store: store,
  httpOnly: false,
  resave: true,
  saveUninitialized: true
});

app.use(sessionConfig);

io.use(sharedsession(sessionConfig, {
  autoSave:true
})); 

app.get('/', function(req, res) {
  res.send('<html><head><script src="http://localhost:3001/socket.io/socket.io.js"></script><script>var socket = io();</script></head><body>Test</body></html>');
});

io.on('connection', (socket) => {
  console.log('a user connected');
  console.log('socket.handshake',socket.handshake.session);
  console.log(socket.handshake.xdomain);
  console.log("A USER LOGGED IN WITH ID: ", socket.request.user); 

  // Accept a login event with user's data
  socket.on("login", function(userdata) {
    socket.handshake.session.userdata = userdata;
    socket.handshake.session.save();
  });

  socket.on("logout", function(userdata) {
    if (socket.handshake.session.userdata) {
      delete socket.handshake.session.userdata;
      socket.handshake.session.save();
    }
  });        

});

http.listen(3001, () => {
  console.log('listening on *:3000');
});

server = app.listen(3000);

Если я получаю доступ, сеанс успешно создается в MongoDB, я понимаю, что конфигурация с express все в порядке, и Socket Share тот сеанс правильно, когда я пытаюсь подключиться из того же домена.

Проблема в том, что у меня есть мобильное приложение с ioni c v4, которое только доступ из сокетного соединения и сеанс никогда не создается на MongoDB.

Есть мысли?

ОБНОВЛЕНИЕ 1:

Я пытаюсь добавить passport.socketio, чтобы получить правильный способ добавить аутентификацию в мое приложение, и вывод этого кода, Не найден сеанс, верно, сокетное соединение никогда не добавляет сеанс в MongoDB:

var express = require('express');
var session = require('express-session');
var sharedsession = require("express-socket.io-session");
let passport = require('passport');
let passportSocketIo = require("passport.socketio");
let cors = require('cors')

var MongoDBStore = require('connect-mongodb-session')(session);

var app = express();
var http = require('http').createServer(app);
var io = require('socket.io')(http);


var store = new MongoDBStore({
  uri: 'MONGO DB STRING CONNECTION',
  collection: 'sessions',
    connectionOptions: { 
    useNewUrlParser: true
  }
});

// Catch errors
store.on('error', function(error) {
  console.log(error);
});

app.use(cors());
app.use(passport.initialize());
app.use(passport.session()); 

let config = {
  passport : passport,
  secret: 'This is a secret',
  cookie: {
    maxAge: 1000 * 60 * 60 * 24 * 7 // 1 week
  },
  store: store,
  httpOnly: false,
  resave: true,
  saveUninitialized: true,
  success:      onAuthorizeSuccess,  // *optional* callback on success - read more below
  fail:         onAuthorizeFail 
};

let sessionConfig = require('express-session')(config);
app.use(sessionConfig);

io.origins('*:*');

io.use(sharedsession(sessionConfig, passportSocketIo.authorize(config))); 

app.get('/', function(req, res) {
  res.send('<html><head><script src="http://localhost:3001/socket.io/socket.io.js"></script><script>var socket = io();</script></head><body>Test</body></html>');
});

io.on('connection', (socket) => {
  console.log('a user connected');
  console.log('socket.handshake',socket.handshake.session);
  console.log(socket.handshake.xdomain);
  console.log("A USER LOGGED IN WITH ID: ", socket.request.user); 

  // Accept a login event with user's data
  socket.on("login", function(userdata) {
    socket.handshake.session.userdata = userdata;
    socket.handshake.session.save();
  });

  socket.on("logout", function(userdata) {
    if (socket.handshake.session.userdata) {
      delete socket.handshake.session.userdata;
      socket.handshake.session.save();
    }
  });        

});

http.listen(3001, () => {
  console.log('listening on *:3000');
});

server = app.listen(3000);

function onAuthorizeSuccess(data, accept){
  console.log('successful connection to socket.io');
  // accept(); //Let the user through
}

function onAuthorizeFail(data, message, error, accept){

  console.log("Errror",error);

  if(error) accept(new Error(message));
  console.log('failed connection to socket.io:', message);
  // accept(null, false);
}

1 Ответ

0 голосов
/ 21 апреля 2020

Попробуйте

//Before io.on('connection.... 
io​.​engine​.​generateId​ ​=​ (​req​) ​=>​ {

//Try to get the cookie out from
//req.rawHeaders and return it
//so the socket ID will equal to the session Id


});

//The connection event
​io​.​on​(​'​connection​'​, ​socket​ ​=>​ { ....

//You can then do a mongoose search query using the socket Id here to match the user in the db
...