13

node.jsとexpressには、セッションデータを取得する方法を示す多くの例があります。

3番目のリンクにアクセスするとわかるように、これはStackOverflowへのリンクです。良い答えがありましたが、@ UpTheCreekによるコメントで指摘されているように、connectにはparseCookieメソッドがありません。私もこの問題に遭遇しました。parseCookie私が見つけたすべてのチュートリアルは、現在は存在しないconnectのメソッドを使用しています。そこで、セッションデータを取得する方法を尋ねたところ、彼は最善のアプローチがわからないと言ったので、ここに質問を投稿すると思いました。express@3.0.0rc4、、、socket.ioおよびを使用redisする場合、セッションデータを取得し、それを使用してユーザーを承認するにはどうすればよいですか?使用することはできましたが、使用するrequire('connect').utils.parseSignedCookie;と、ハンドシェイク時に常に警告/エラーが発生します。

warn - handshake error Error

そして私が読んだことから、それはとにかく恒久的な解決策ではないように思えます。


アップデート

わかりsession.socket.ioました。サーバーで作業しました。そして、私が疑ったように、私は承認の時点で立ち往生しました。私はこれを間違った方向に進めているのではないかと思うので、遠慮なく訂正してください。私のRedisデータベースには、ユーザーの情報があります。初めてログインするときは、ユーザー情報が含まれるようにCookieを更新したいと思います。次に、彼らがサイトに戻ってきたときに、彼らがCookieを持っているかどうか、そしてユーザー情報がそこにあるかどうかを確認したいと思います。そこにない場合は、ログイン画面に送信したいと思います。ログイン画面で、ユーザーが情報を送信すると、Redisデータベースに対してその情報をテストし、一致する場合は、ユーザー情報でCookieを更新します。私の質問は次のとおりです。

1)RedisStoreを介してCookieを更新/変更するにはどうすればよいですか?

2)セッションデータはCookieにのみ保存されているようです。誰かがCookieをオフにしている場合、ページ間でユーザー情報を追跡するにはどうすればよいですか?

これが私の適用可能なコードです:

//...hiding unapplicable code...
var redis = require('socket.io/node_modules/redis');
var client = redis.createClient();
var RedisStore = require('connect-redis')(express);
var redis_store = new RedisStore();
var cookieParser = express.cookieParser('secret');

app.configure(function(){
  //...hiding unapplicable code...
  app.use(cookieParser);
  app.use(express.session({secret: 'secret', store: redis_store}));
});

//...hiding code that starts the server and socket.io

var SessionSockets = require('session.socket.io');
var ssockets = new SessionSockets(io, redis_store, cookieParser);

io.configure(function(){
  io.set('authorization', function(handshake, callback){
    if(handshake.headers.cookie){
      //var cookie = parseCookie(handshake.headers.cookie);
      //if(cookie.user){
      //  handshake.user = cookie.user;
      //}
    }
    callback(null, true);
  });
});

ssockets.on('connection', function(err, socket, session){ ... });
4

4 に答える 4

6

socket.ioのwikiを見てください。特に、Socket.IOの構成承認およびハンドシェイクの部分。

でsocket.ioを使用する方法を示し、RedisStore2つの異なる認証方法を示します。

Express v3、redis、socket.ioの接続に関する詳細情報

于 2012-10-11T14:27:35.530 に答える
4

しばらく切り替えた後session.socket.io、セッション情報をロードするときにモジュールの非同期性が原因で、いくつかの問題が発生しました。そのため、 session.ioという独自のモジュールを作成することになりました。これは次のように使用されます。

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

//Setup cookie and session handlers
//Note: for sessionStore you can use any sessionStore module that has the .load() function
//but I personally use the module 'sessionstore' to handle my sessionStores.
var cookieParser = express.cookieParser('secret');
var sessionStore = require('sessionstore').createSessionStore();

app.configure(function(){
  app.set('port', process.env.PORT || 3000);
  //...truncate...//
  app.use(cookieParser);
  //make sure to use the same secret as you specified in your cookieParser
  app.use(express.session({secret: 'secret', store: sessionStore}));
  app.use(app.router);
});

app.get('/', function(req, res){
  res.send('<script src="/socket.io/socket.io.js"></script><script>io.connect();</script>Connected');
});

server.listen(app.get('port'), function(){
  console.log('Listening on port ' + app.get('port'));
});

var io = require('socket.io').listen(server);

io.configure(function(){
  //use session.io to get our session data
  io.set('authorization', require('session.io')(cookieParser, sessionStore));
});

io.on('connection', function(socket){
  //we now have access to our session data like so
  var session = socket.handshake.session;
  console.log(session);
});
于 2013-03-27T21:29:50.807 に答える
2

あなたの質問:

  1. RedisStoreを介してCookieを更新/変更するにはどうすればよいですか?
  2. セッションデータはCookieにのみ保存されているようです。誰かがCookieをオフにしている場合、ページ間でユーザー情報を追跡するにはどうすればよいですか?

クッキー/セッション/RedisStoreの考え:

  1. 通常、セッションIDであるCookieは1つだけです。
  2. すべてのユーザー状態は、セッションIDを介して見つけることができる「セッション」でサーバーに保存されます
  3. セッションデータのバックエンドストレージとしてRedisを使用できます。
  4. Redisを使用すると、サーバーが再起動された場合でもセッション状態を維持できます(良いこと)
  5. 大量のデータをセッションに保存できます(req.session.key = value)
  6. セッションに保存されているすべてのデータは、ユーザーがログアウトするか、セッションが期限切れになるまで保持されます

node.jsコードの例:

var app = express.createServer(
  express.static(__dirname + '/public', { maxAge: 31557600000 }),
  express.cookieParser(),
    express.session({ secret: 'secret', store: new RedisStore({
          host: 'myredishost',
          port: 'port',
          pass: 'myredispass',
          db: 'dbname',
      }, cookie: { maxAge: 600000 })})
);

セッションとCookieの考え:

  1. 2番目の問題は、Cookieを使用しないセッションについてです。これは可能です。
  2. 基本的に、サーバーに送信するすべてのリクエストのURLにセッションIDを設定します。
  3. 私はほとんどの人がクッキーを許可していると強く信じています。
  4. これが要件である場合、グーグル:「クッキーなしのセッション」
于 2012-10-16T21:11:51.350 に答える
-2

セッションデータは次のもので利用できます。

req.session
于 2012-10-09T17:49:09.383 に答える