2012-04-28 20 views
14

Düğümde, Express çerçevesini ve oturum ara katman yazılımını kullanan tipik bir web uygulamasına sahibim. Uygulamamın bazı dinamik bölümleri için de Socket.io kullanıyorum (şu anda bu bir sohbet mekanizmasıdır, fakat bu teğettir). Oturumları ve socket.io'yu kendi başlarına başarıyla kurabildim, ancak bunları birleştirmek istiyorum (EG: soket sohbet mesajlarını veritabanına girmeden kullanıcı hesaplarıyla ilişkilendirmek).Çerezlerden Express oturum kimliğini alamıyor w/Socket.IO

Dikkat edilmelidir (ve bunun olası bir sorun noktası olduğunu görebiliyorum), farklı bağlantı noktalarında iki ekspres sunucu çalıştırıyorum: biri düzenli HTTP trafiği ve bir tanesi HTTPS trafiği için. Bununla birlikte, her iki sunucuda da iddialı bir yapılandırma geçiriyorum ve aynı oturum mağazasını paylaşıyorum. Http ve https sayfaları arasında oturumlar benim için devam ediyor. Oturum başlangıçta HTTPS'den sunulan bir sayfa aracılığıyla ve socket.io sayfası vanilya HTTP ile ayarlanıyor.

socket.io ve oturumları entegre etme konusunda aradığım şeyi elde etmek için here numaralı kılavuza gidiyorum. Ancak, yetkilendirme işlevinde, uygulamamın oturum tabanlı bölümleri beklendiği gibi çalışmaya rağmen data.headers.cookie hiçbir zaman ayarlanmaz. Garip bir oturum açtıktan sonra, tarayıcıdan bir console.log(document.cookie) yaparsam boş bir dize alıyorum, ancak Firefox geliştirici araç çubuğu ile çerezlerime baktığımda, hem ifade hem de bağlantı için bir SID çerezi var. İşte

sunucu kodunun ilgili kısmıdır:

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); 
    }); 
} 

Ve burada istemci üzerinde ilgili kod:

<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> 

GÜNCELLEME

bile elle bir çerez ayarladıktan sonra SocketIO kullanan sayfa için rotada (sadece bir oturum değişkenini değil), isteğin çerez kısmı hala yok.

cevap

11

İstemci tarafında başlatma işlemine bakana kadar bunu düşünmezdim. Adresini localhost'tan açık IP'ye (127.0.0.1) değiştirdim ve çerezler şimdi Socket.IO'daki başlıkla birlikte gönderiliyor. Bu durumun açık olup olmadığından emin değilim, zira yerel ağın zaten 127.0.0.1 ile eşleştirildiğini farz ettim.

+8

Tam olarak! Bu yüzden müşteri kodunu istedim. Ayrıca, herhangi bir ana bilgisayar vermeden 'var socket = io.connect();' kullanabilirsiniz. Çalışmalı. – freakish

+0

Tam olarak aynı sorun benim için, ve bu mükemmel çalıştı. – bento

İlgili konular