rails和node.js与redis存储之间的共享authentication

我有一个rails应用程序和一个node.js应用程序,我使用Devise来validation用户。 我将会话存储在Redis中。 现在,当用户转到节点应用程序时,应用程序将通过socket.io检查用户是否已login。 我设法从redis获取会话数据,但我不知道如何解释它们来检查用户是否login。

这里是我的节点应用程序代码,它检查数据库中是否存在_session_id并检索会话数据:

io.set('authorization', function (data, accept) { if (data.headers.cookie) { data.cookie = cookie.parse(data.headers.cookie); data.sessionID = data.cookie['_session_id']; redis.get(data.sessionID, function (err, session) { if (err || !session) { accept('Error', false); } else { data.session = session; console.log(session); accept(null, true); } }); } else { return accept('No cookie transmitted.', false); } }); 

这是console.log(会话)给我的:

 {I"_csrf_token:EFI"1HPglfkCCagvb1LLraU1CEEyx7AtDzztqAEPY5G5lNgY=;FI"warden.user.user.key;TI" User;F[iI""$2a$10$IHq2WAhwbaqR4WWajRE/Yu;T 

如何检查用户是否使用节点应用程序loginRails应用程序? 谢谢

编辑:看来,我使用的redis商店gem在将会话存储在数据库之前调用一个编组方法。 所以我绕过了这个问题,重写了编组方法并以JSON格式存储会话数据。 这不是很优雅,所以如果你find一个更好的方式来共享rails和node.js之间的会话,请让我知道。

创build自己的oauth api可能会更容易(有关如何执行此操作的railscast)。 据我所知,devise是一个ruby,并不是真正的跨平台,但oauth几乎可以用于任何语言。 您可以添加一个oauth标记来devise哪个应该允许您将该标记传递给node.js.

你可以很容易地做到这一点,对Rails-Cookie-Parser中的index.js方法进行一些调整,以便https://github.com/instore/rails-cookie-parser库在不使用Express的情况下使用它。

这个库使用Marshal npm作为它的依赖

注意:您可能需要decodeURIComponent(“cookie值”),因为原始cookie是URL编码的