2016-10-20 2 views
0

전에 메시지를 보낼 수는 있지만이 자습서 http://www.scotthasbrouck.com/blog/2016/3/18/passportjs-express-session-with-sockeio에 따라 redis를 사용하여 express와 socket.io로 여권 세션을 공유 했으므로 더 이상 채팅 메시지를 보낼 수 없습니다.socket.io와 채팅 메시지를 보낼 수 없습니다

또한 내 경로 req.isAuthenticated()는 항상 false를 반환하지만 이전에는이 ​​문제가 없었습니다.

이것은 내 server.js입니다.

// server.js 

// set up ====================================================================== 
// get all the tools we need 
var express = require('express'); 
var app  = express(); 
var server = require('http').Server(app); 

var port  = process.env.PORT || 8080; 
var mongoose = require('mongoose'); 
var passport = require('passport'); 
var flash = require('connect-flash'); 

var morgan  = require('morgan'); 
var cookieParser = require('cookie-parser'); 
var bodyParser = require('body-parser'); 


var configDB = require('./config/database.js'); 
var http = require('http').Server(app); 
var io = require('socket.io')(http); 
var passportSocketIo = require('passport.socketio'); 
var session  = require('express-session'); 
var chatdb = require('./app/models/chat.js'); 
var user = require('./app/models/user.js'); 
var redis = require('redis'); 
var client = redis.createClient(); 
var RedisStore = require('connect-redis')(session); 

// configuration =============================================================== 
mongoose.connect(configDB.url); // connect to our database 

require('./config/passport')(passport); // pass passport for configuration 

// set up our express application 
app.use(morgan('dev')); // log every request to the console 
app.use(cookieParser()); // read cookies (needed for auth) 
app.use(bodyParser()); // get information from html forms 

app.set('view engine', 'ejs'); // set up ejs for templating 

var sessionStore = new RedisStore({ host: 'localhost', port: 6379, client: client, ttl: 260 }); 

// required for passport 
app.use(session({ 
    secret: 'secret', 
    store: sessionStore, 
    resave: true, 
    saveUninitialized: true, 
cookie: { 
    secure: process.env.ENVIRONMENT !== 'development' && process.env.ENVIRONMENT !== 'test', 
maxAge: 2419200000 
}, 

})); 
app.use(passport.initialize()); 
app.use(passport.session()); // persistent login sessions 
app.use(flash()); // use connect-flash for flash messages stored in session 
app.use(express.static(__dirname + '/views')); 
app.use(express.static(__dirname + '/public')); 
io.use(passportSocketIo.authorize({ 
    key: 'connect.sid', 
    secret: 'secret', 
    store: sessionStore, 
    passport: passport, 
    cookieParser: cookieParser, 
})); 

var eventSocket = io.of('/chat'); 

// socket.io 


io.on('connection', function (socket) { 
console.log('a user connected'); 

socket.on('chat message', function(msg){ 
    var name = "efe"; 
    chatdb.saveMsg({name: name, msg: msg}, function(err){ 
     if(err) throw err; 
     io.emit('chat message', msg); 
    }); 

    if (socket.request.user && socket.request.user.logged_in) { 
     console.log(socket.request.user); 
    } 
}); 


    }); 

// routes ====================================================================== 
    require('./app/routes.js')(app, passport); // load our routes and pass in our app and fully configured passport 

    // launch ====================================================================== 
    http.listen(port); 
    console.log('The magic happens on port ' + port); 
+0

당신은 오류 메시지를 받으셨어요? – James111

+0

@ James111 아니요, 오류 메시지가 표시되지 않습니다. 그것은 단지 작동하지 않습니다. –

답변

-1

이것은 어떻게 해결할 수 있었는지입니다.

var express = require('express'); 
 
var app = express(); 
 
var server = require('http').Server(app); 
 

 
var port = process.env.PORT || 8080; 
 
var mongoose = require('mongoose'); 
 
var passport = require('passport'); 
 
var flash = require('connect-flash'); 
 

 
var morgan = require('morgan'); 
 
var cookieParser = require('cookie-parser'); 
 
var bodyParser = require('body-parser'); 
 
var session = require('express-session'); 
 

 
// Add connect-mongo to project - npm install connect-mongo 
 
var MongoStore = require('connect-mongo')(session); 
 

 
var configDB = require('./config/database.js'); 
 
var http = require('http').Server(app); 
 
var io = require('socket.io')(http); 
 
var chatdb = require('./app/models/chat.js'); 
 

 
// configuration =============================================================== 
 
// NOTE: This might need to be put into a callback/promise inside an initialize function 
 
var db = mongoose.connect(configDB.url); // connect to our database 
 

 
require('./config/passport')(passport); // pass passport for configuration 
 

 
// set up our express application 
 
app.use(morgan('dev')); // log every request to the console 
 
app.use(cookieParser()); // read cookies (needed for auth) 
 
app.use(bodyParser()); // get information from html forms 
 

 
app.set('view engine', 'ejs'); // set up ejs for templating 
 
var mongoStore = new MongoStore({ 
 
    mongooseConnection: db.connection, 
 
}); 
 
app.use(session({ 
 
    secret: 'secret', 
 
    clear_interval: 900, 
 
    cookie: { maxAge: 2 * 60 * 60 * 1000 }, 
 
    store: mongoStore, 
 
})); 
 

 

 
// required for passport 
 
app.use(session({ secret: 'secret' })); // session secret 
 
app.use(passport.initialize()); 
 
app.use(passport.session()); // persistent login sessions 
 
app.use(flash()); // use connect-flash for flash messages stored in session 
 
app.use(express.static(__dirname + '/views')); 
 
app.use(express.static(__dirname + '/public')); 
 

 

 
// Intercept Socket.io's handshake request 
 
io.use(function(socket, next) { 
 

 
    // Use the 'cookie-parser' module to parse the request cookies 
 
    cookieParser('secret')(socket.request, {}, function(err) { 
 

 
     // Get the session id from the request cookies 
 
     var sessionId = socket.request.signedCookies ? socket.request.signedCookies['connect.sid'] : undefined; 
 

 
     if (!sessionId) return next(new Error('sessionId was not found in socket.request'), false); 
 

 
     // Use the mongoStorage instance to get the Express session information 
 
     mongoStore.get(sessionId, function(err, session) { 
 

 
      if (err) return next(err, false); 
 
      if (!session) return next(new Error('session was not found for ' + sessionId), false); 
 

 
      // Set the Socket.io session information 
 
      socket.request.session = session; 
 

 
      // Use Passport to populate the user details 
 
      passport.initialize()(socket.request, {}, function() { 
 
       passport.session()(socket.request, {}, function() { 
 
        // This will prohibit non-authenticated users from connecting to your 
 
        // SocketIO server. 
 
        if (socket.request.user) { 
 
         next(null, true); 
 
        } else { 
 
         next(new Error('User is not authenticated'), false); 
 
        } 
 
       }); 
 
      }); 
 
     }); 
 
    }); 
 
    }); 
 

 
// socket.io 
 
io.on('connection', function(socket) { 
 

 
    socket.on('chat message', function(msg) { 
 
     console.log(socket.request.user.facebook.name || socket.request.user.local.email); 
 
     var name = socket.request.user.facebook.name || socket.request.user.local.email; 
 
     chatdb.saveMsg({ 
 
      name: name, 
 
      msg: msg 
 
     }, function(err) { 
 
      if (err) throw err; 
 
      io.emit('chat message', msg); 
 
     }); 
 
    }); 
 

 
    socket.on('disconnect', function() { 
 
     console.log('user disconnected'); 
 
    }); 
 
}); 
 

 
// routes ====================================================================== 
 
require('./app/routes.js')(app, passport); // load our routes and pass in our app and fully configured passport 
 

 
// launch ====================================================================== 
 
http.listen(port); 
 
console.log('The magic happens on port ' + port);

3

나는 동일한 문제가있었습니다. 나는 너 같은 passport.socketio을 구현하려고 시도했지만 그걸로 내 문제를 해결했다.

여기에 내 미들웨어 :

// Express session middleware 
var sessionMiddleware = session({ secret: 'secret-key', resave: true, saveUninitialized: true }); 

// Send Express sessionMiddleware through socket.io 
io.use(function(socket, next){ 
    // Params: request object, response object and callback. 
    sessionMiddleware(socket.request, {}, next); 
}); 

두번째 파라미터 (Response 오브젝트) sessionMiddleware 기능 비어있다. 이렇게하면 세션이 읽기 전용으로 렌더링됩니다.

io.on("connection", function(socket){ 
    socket.on('chat message', function(msg){ 
    var passport = socket.request.session.passport; // Get the passport variable 

    // Check if passport session exists 
    if (passport && typeof passport !== 'undefined'){ 

     var userSession = passport.user; // Get the user session 

     // Build JSON with user session data 
     var message = { 
     message : msg, 
     name : userSession.name, 
     avatar : userSession.avatar 
     }; 

     io.emit('chat message', message); // Emit my socket 
    } 
    }); 
}); 

가 도움이 희망 : 여기

그리고 내가 사용자 정보를 얻기 위해 여권 JS 세션 변수를 사용하는 방법입니다.

+0

고마워, 이건 내 req.authenticated 오류를 수정했습니다. –

+0

설명해 주시겠습니까 –

+0

이 코드 조각이 무엇을 의미하는지 설명해주십시오. var sessionMiddleware = session ({secret : 'secret-key', resave : true, saveUninitialized : true}); io.use (function (socket, next) { sessionMiddleware (socket.request, {}, 다음), }); –

관련 문제