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
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.
Tam olarak! Bu yüzden müşteri kodunu istedim. Ayrıca, herhangi bir ana bilgisayar vermeden 'var socket = io.connect();' kullanabilirsiniz. Çalışmalı. – freakish
Tam olarak aynı sorun benim için, ve bu mükemmel çalıştı. – bento