5

Redis をセッション ストアとして使用する Rails 3.2 アプリケーションがあります。今、私は Node.js の新機能の一部を書き込もうとしており、2 つのアプリ間でセッション情報を共有できるようにしたいと考えています。

私が手動でできることは、_session_idCookie を読み取り、次に という名前の Redis キーから読み取ることですrack:session:session_idが、これはハックっぽいソリューションのように見えます。

Node.js と Rails の間でセッションを共有するより良い方法はありますか?

4

2 に答える 2

2

私はこれを行いましたが、独自のフォークを作成する必要があります

まず、セッション キーを同じ名前にする必要があります。それが最も簡単な仕事です。

次に、redis-store gem のフォークを作成し、マーシャリングの場所を変更しました。javascript 用の Ruby スタイルのマーシャル モジュールを見つけるのは簡単ではないため、両側で json について話す必要があります。マーシャリングを変更するファイル

また、接続のセッション ミドルウェア部分も置き換える必要がありました。作成されるハッシュは非常に具体的で、レールが作成するものとは一致しません。もっと良い方法があるかもしれないので、解決するためにこれをあなたに任せる必要があります。接続をフォークすることもできましたが、代わりに、接続 > ミドルウェア > セッション アウトのコピーを抽出し、独自のインを要求しました。

Rails バージョンには存在しない基本変数が元のバージョンにどのように追加されているかに気付くでしょう。さらに、レールがノードの代わりにセッションを作成した場合を処理する必要があります。これは、generateCookie 関数が行うことです。

/***** ORIGINAL *****/
// session hashing function
store.hash = function(req, base) {
  return crypto
    .createHmac('sha256', secret)
    .update(base + fingerprint(req))
    .digest('base64')
    .replace(/=*$/, '');
};

// generates the new session
store.generate = function(req){
  var base = utils.uid(24);
  var sessionID = base + '.' + store.hash(req, base);
  req.sessionID = sessionID;
  req.session = new Session(req);
  req.session.cookie = new Cookie(cookie);
};

/***** MODIFIED *****/
// session hashing function
store.hash = function(req, base) {
  return crypto
    .createHmac('sha1', secret)
    .update(base)
    .digest('base64')
    .replace(/=*$/, '');
};

// generates the new session
store.generate = function(req){
  var base = utils.uid(24);
  var sessionID = store.hash(req, base);
  req.sessionID = sessionID;
  req.session = new Session(req);
  req.session.cookie = new Cookie(cookie);
};

// generate a new cookie for a pre-existing session from rails without session.cookie
// it must not be a Cookie object (it breaks the merging of cookies)
store.generateCookie = function(sess){
  newBlankCookie = new Cookie(cookie);
  sess.cookie = newBlankCookie.toJSON();
};

//... at the end of the session.js file
  // populate req.session
  } else {
    if ('undefined' == typeof sess.cookie) store.generateCookie(sess);
    store.createSession(req, sess);
    next();
  }

これがうまくいくことを願っています。彼らが同じように話すようにするには、かなりの時間を費やしました。

フラッシュメッセージがjsonに保存されているという問題も見つかりました。うまくいけば、あなたはそれを見つけません。Flash メッセージには、シリアライズ時に json が吹き飛ばす特別なオブジェクト構造があります。フラッシュ メッセージがセッションから復元されると、適切なフラッシュ オブジェクトがない可能性があります。これにもパッチを当てる必要がありました。

于 2012-05-02T23:41:49.673 に答える
1

これを使用する予定がない場合、これはまったく役に立たないかもしれませんが、ノードでの私のセッション経験はすべて、Connect を使用したものです。途中で接続セッションを使用して、キー ID を変更できます。

http://www.senchalabs.org/connect/session.html#session

このモジュールを使用して、redis をセッション ストアとして使用します。

https://github.com/visionmedia/connect-redis

あなたが説明したようなものをセットアップしたことはありませんが、必要なハッキングがあるかもしれません。

于 2012-04-24T15:09:12.477 に答える