2012-04-28 7 views
14

Expressフレームワークとセッションミドルウェアを利用しているノードには、典型的なWebアプリケーションがあります。私はまた、私のアプリケーションの特定の動的部分にSocket.ioを使用しています(現在、これはチャットのメカニズムですが、それは接線です)。私は正常にセッションとsocket.ioを自分でセットアップすることができましたが、それらを組み合わせたい(EG:ソケットチャットメッセージをデータベースにぶつかることなくユーザーアカウントと関連付けるため)。クッキーからExpressセッションIDを取得できません。

これは注目すべき点です(私はこれが問題点であると考えています)。別のポートで2つの高速サーバーを実行しています.1つは通常のHTTPトラフィック用、もう1つはHTTPSトラフィック用です。しかし、私は両方のサーバーに同一の設定を行い、同じセッションストアを共有しています。セッションは、httpとhttpsのページの間に私のために持続します。セッションは、HTTPSから提供されるページを介して最初に設定され、socket.ioページはvanilla HTTPです。

socket.ioとセッションを統合するために私が探しているものを達成するために、hereというガイドに従っています。ただし、アプリケーションのセッションベース部分が期待どおりに機能しているにもかかわらず、承認関数内でdata.headers.cookieが決して設定されません。もっと奇妙なのは、セッションを設定した後、ブラウザ内からconsole.log(document.cookie)を実行すると空の文字列が得られますが、Firefox開発ツールバーでクッキーを見ると、エクスプレスと接続の両方のSID Cookieがあります。ここで

は、サーバコードの関連部分である:

<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

でも手動でクッキーを設定した後:

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

そしてここでは、クライアント上の関連するコードですSocketIOを使用しているページのルートにある(セッション変数だけでなく)リクエストのクッキー部分は依然として不在。

答えて

11

クライアント側の初期化を見るまで、私は決して考えなかったでしょう。アドレスをlocalhostから明示的なIP(127.0.0.1)に変更しました。この時点で、CookieはSocket.IOのヘッダーとともに送信されています。とにかくlocalhostが127.0.0.1にマップされていると仮定したので、これが明白かどうかはわかりません。

+8

正確に!だからこそ私はクライアントコードを望んでいた。また、 'var socket = io.connect();'を使うこともできます。うまくいくはずです。 – freakish

+0

私にとってまったく同じ問題ですが、これは完全に機能しました。 – bento

関連する問題