2012-04-28 8 views
14

Express 프레임 워크와 세션 미들웨어를 사용하는 노드에 일반적인 웹 응용 프로그램이 있습니다. 나는 또한 내 응용 프로그램의 특정 동적 부분에 대해 Socket.io를 사용하고 있습니다 (현재 이것은 채팅 메커니즘이지만 접선입니다). 나는 성공적으로 세션과 socket.io를 스스로 설정할 수 있었지만 그것들을 결합하고 싶다. (EG : 소켓 채팅 메시지를 데이터베이스에 연결하지 않고 사용자 계정과 연관시키기 위해).w/Socket.IO가있는 쿠키에서 Express 세션 ID를 가져올 수 없습니다.

주목해야 할 점은 (나는 이것이 가능한 문제 점임을 알 수 있습니다.) 다른 포트에서 두 개의 고속 서버를 실행하고 있습니다. 하나는 일반 HTTP 트래픽 용이고 다른 하나는 HTTPS 트래픽 용입니다. 그러나 두 서버를 모두 동일한 구성으로 사용하고 동일한 세션 저장소를 공유합니다. 세션은 http와 https 페이지간에 계속 유지됩니다. 세션은 HTTPS에서 제공되는 페이지를 통해 처음 설정되며 socket.io 페이지는 vanilla HTTP입니다.

socket.io와 세션을 통합하는 데있어 내가 찾고있는 목표를 달성하기 위해 here에있는 가이드를 따르고 있습니다. 그러나 인증 기능 내에서 응용 프로그램의 세션 기반 부분이 예상대로 작동 함에도 불구하고 data.headers.cookie가 설정되지 않습니다. 좀 더 이상한 점은 세션을 설정 한 후 브라우저에서 console.log(document.cookie)을 실행하면 빈 문자열이 표시되지만 Firefox 개발자 툴바로 쿠키를 보면 express와 connect 모두에 대해 SID 쿠키가 있다는 것입니다. 여기

는 서버 코드의 관련 부분입니다 :

var config = { 
    ip   : "127.0.0.1", 
    httpPort : 2031, 
    httpsPort : 2032 
}; 

var utils  = require("./utils"), 
    express  = require('express'), 
    fs   = require('fs'), 
    parseCookie = require('./node_modules/express/node_modules/connect').utils.parseCookie, 
    routes  = require('./routes')(config); 

var httpsOpts = { 
    key : fs.readFileSync("cert/server-key.pem").toString(), 
    cert: fs.readFileSync("cert/server-cert.pem").toString() 
}; 

var app    = express.createServer(), 
    https   = express.createServer(httpsOpts), 
    io    = require("socket.io").listen(app, { log: false}), 
    helpers   = require("./helpers.js"), 
    session   = new express.session.MemoryStore(), 
    sessionConfig = express.session({ 
     store : session, 
     secret : 'secret', 
     key  : 'express.sid', 
     cookie : {maxAge : 60 * 60 * 1000} 
    }); //share this across http and https 

configServer(app); 
configServer(https); 

//get SID for using sessions with sockets 
io.set('authorization', function(data, accept){ 
    if(data.headers.cookie){ 
     data.cookie = parseCookie(data.headers.cookie); 
     data.sessionID = data.cookie['express.sid']; 
    } else { 
     return accept("No cookie transmitted", false); 
    } 

    accept(null, true); 
}); 

io.sockets.on('connection', function(socket){ 
    //pull out session information in here 
}); 

function configServer(server) { 
    server.configure(function(){ 
     server.dynamicHelpers(helpers.dynamicHelpers); 
     server.helpers(helpers.staticHelpers); 
     server.set('view options', { layout: false }); 
     server.set('view engine', 'mustache'); 
     server.set('views', __dirname + '/views'); 
     server.register(".mustache", require('stache')); 
     server.use(express.static(__dirname + '/public')); 
     server.use(express.bodyParser()); 
     server.use(express.cookieParser()); 
     server.use(sessionConfig); 
    }); 
} 

을 그리고 여기에 클라이언트의 관련 코드입니다 :

<script src="/socket.io/socket.io.js"></script> 
<script type="text/javascript"> 
    $(document).ready(function(){ 
     var socket = io.connect('http://127.0.0.1'); //make sure this isn't localhost! 
     socket.on('server', function(data){ 
      //socket logic is here 
     }); 
    } 
</script> 

UPDATE

에도 수동으로 쿠키를 설정 한 후 (세션 변수뿐만 아니라) SocketIO를 사용하는 페이지의 경로에서 요청의 쿠키 부분은 여전히 없는.

답변

11

클라이언트 측의 초기화를 살펴볼 때까지는 결코 이런 생각을하지 못했습니다. 주소를 localhost에서 명시 적 IP (127.0.0.1)로 변경했으며 이제 쿠키가 Socket.IO의 헤더와 함께 전송됩니다. 어쨌든 localhost가 127.0.0.1로 매핑되었다고 가정 할 때 이것이 확실한 것인지 확실하지 않습니다.

+8

바로! 그래서 클라이언트 코드를 원했습니다. host를주지 않고'var socket = io.connect();'를 사용할 수도있다. 일해야한다. – freakish

+0

정확히 똑같은 문제가 생겼고 완벽하게 작동했습니다. – bento

관련 문제