Socket.io và Session của Express



  • @Ha-Linh express có thể chia sẻ với socket io bằng cách sử dụng chung http.

    var express = require('express');
    var app = express();
    var http = require('http').Server(app);
    var io = require('socket.io')(http);
    
    http.listen(8000, function() {
    	log('running on 8000');
    });
    
    app.use(... cookies...)
    app.use(... body_parser...)
    app.sessionStore = function(req,res,next){...}
    app.use(app.sessionStore)
    app.use(... passport ... )
    
    io.use(function(socket,next){
    return app.sessionStore(socket.request, socket.request.res, next);
    })
    
    io.on('connection', function(socket) {
    	// console.log(socket.request.session)
    })
    
    


  • Thank @hidemanvn rất nhiều.



  • Hi @hidemanvn

    Hiện tại mình cũng đang share session cho cả socket và http sử dụng passport để đảm bảo việc authentication cho cả http và socket.
    Vấn đề mình mới gặp là mình muốn sử dụng socket khi không login (Ví dụ khi người dùng không login, nhưng vẫn load/update data từ server về qua socket). Liệu có giải pháp nào không nhỉ?



  • @Hiep-Trinh khi không login bạn vẫn sử dụng bình thường thôi. Bạn cứ hình dung Session là cái cổng. Người đã login mới có quyền vào một số khu vực, còn người dùng chưa login vẫn được đứng ngoài nhìn vậy.



  • @hidemanvn

    Vấn đề của mình là khi login thì mới connect đc với socket. Còn khi không login thì không connect được. Bạn xem hộ mình xem config sai ở đâu
    https://codeshare.io/5OKn6x



  • @Hiep-Trinh bạn thử io.sockets.on => io.on xem.



  • @hidemanvn k đc bạn ạ



  • Bạn set fail/success callback cho module passport.socketio chưa ?

    io.use(passportSocketIo.authorize({
    	key: 'connect.sid',
    	secret: 'secret',
    	store: sessionStore,
    	passport: passport,
    	cookieParser: require('cookie-parser'),
      success: .... 
      fail:function(data, message, error, accept){
        if (error) {
          console.log(message);
            accept(null, false);
        }
      }
    }));
    ....
    io.sockets.on('connection', function(socket) {
      console.log("Connected"); // can not go here without authentication
      console.log(socket.request.user) // { logged_in: false }
    });
    


  • @hidemanvn

    Mình set fail/success callback cho passport.socketio rồi. Nếu validate err, khi không login thì hàm authorize sẽ return err :"User not authorized through passport. (User Property not found)". Dường như khi share session, nó yêu cầu tất cả phải authenticate qua passport.

    Nếu mình chỉ return accept() trong hàm fail callback thì sẽ connect được socket. Nhưng mình không chắc nó có rủi ro gì k. Mình mới làm với passport nên không rõ, bạn có ý kiến j trong trường hợp fail callback return accept() để đồng ý tất cả mọi connect k?



  • Theo mình thì không có rủi ro gì. Vì bên router của socket đã có socket.request.user để kiểm tra việc logged hay chưa. Bạn dùng params đó để điều hướng.



  • Cám ơn @hidemanvn


Log in to reply