5

我有一个使用 Redis 作为会话存储的 Rails 3.2 应用程序。现在我要在 Node.js 中编写一部分新功能,并且我希望能够在两个应用程序之间共享会话信息。

我可以手动做的是读取_session_idcookie,然后从名为 的 Redis 键读取rack:session:session_id,但这看起来有点像 hack-ish 解决方案。

有没有更好的方法在 Node.js 和 Rails 之间共享会话?

4

2 回答 2

2

我已经这样做了,但它确实需要自己制作东西

首先,您需要使会话密钥具有相同的名称。这是最简单的工作。

接下来,我创建了 redis-store gem 的一个分支并修改了编组的位置。我需要在双方讨论 json,因为为 javascript 找到一个 ruby​​ 样式的 marshal 模块并不容易。我更改编组的文件

我还需要替换连接的会话中间件部分。创建的哈希非常具体,与 rails 创建的一个不匹配。我需要把这个留给你解决,因为可能有更好的方法。我本可以分叉连接,但我提取了连接 > 中间件 > 会话的副本并需要我自己的副本。

您会注意到原始版本如何添加在 rails 版本中不存在的基本变量。另外,您需要处理 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 在序列化时会被吹走。当从会话中恢复 flash 消息时,您可能没有正确的 flash 对象。我也需要为此打补丁。

于 2012-05-02T23:41:49.673 回答
1

This may be completely unhelpful if you're not planning on using this, but all of my session experience with node is through using Connect. You could use the connect session middlewhere and change the key id:

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

and use this module to use redis as your session store:

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

I've never setup something like what your describing though, there may be some necessary hacking.

于 2012-04-24T15:09:12.477 回答