4

Im trying to access session object like req.user in socket.io so that I could do something with it, Im using passport.socket.io library to do this. However the problem right now is that i keep getting failed connection to socket.io: No session found.

Here's the code

    var express = require('express');
    var session = require('express-session');
    var cookieParser = require('cookie-parser');
    var MongoStore = require('connect-mongo/es5')(session);
    var passport = require('passport');
    var passportSocketIo = require("passport.socketio");

    var config = require('./config/config');


    var sessionStore = new MongoStore({ url: config.database, autoReconnect: true });
    var app = express();
    var http = require('http').Server(app);
    var io = require('socket.io')(http);


    app.use(cookieParser());
    app.use(session({
      resave: true,
      saveUninitialized: true,
      secret: config.secret,
      store: sessionStore
    }));
    app.use(passport.initialize());
    app.use(passport.session());

    io.use(passportSocketIo.authorize({
      cookieParser: cookieParser,       
      key:          express.sid,   // Not really sure how to get this key?
      secret:       config.secret,  
      store:        sessionStore,        
      success:      onAuthorizeSuccess,  
      fail:         onAuthorizeFail,     
    }));

    function onAuthorizeSuccess(data, accept){
      console.log('successful connection to socket.io');
      accept(null, true);  
    }

    function onAuthorizeFail(data, message, error, accept){
      if(error)
        throw new Error(message);
      console.log('failed connection to socket.io:', message);


      accept(null, false);
      if(error)
        accept(new Error(message));
    }

 io.connect('connection', function(socket) {
     console.log("Something Here");
 });


 http.listen(3000);

It keeps running this function because passport has failed to make a handshake with socket.io onAuthorizeFail. How do I solve this problem?

4

1 回答 1

0

在我浏览完express-session文档后,它的密钥有问题。

我已经通过更改解决了这个问题

express.sid => 'connect.sid'

io.use(passportSocketIo.authorize({
   key: 'connect.sid'     
 }));

似乎 express 默认会提供“connect.sid”。

于 2016-01-23T13:54:25.250 回答