Ruby on rails 使用redis store在rails和node.js之间共享身份验证

Ruby on rails 使用redis store在rails和node.js之间共享身份验证,ruby-on-rails,node.js,authentication,devise,redis,Ruby On Rails,Node.js,Authentication,Devise,Redis,我有一个rails应用程序和一个node.js应用程序,我使用Desive对用户进行身份验证。我用Redis存储会话。现在,我希望当用户转到节点应用程序时,应用程序通过socket.io检查用户是否登录。我设法从redis获取了会话数据,但我不知道如何解释它们以检查用户是否登录 下面是我的节点应用程序代码,它检查数据库中是否存在会话id,并检索会话数据: io.set('authorization', function (data, accept) { if (data.headers.

我有一个rails应用程序和一个node.js应用程序,我使用Desive对用户进行身份验证。我用Redis存储会话。现在,我希望当用户转到节点应用程序时,应用程序通过socket.io检查用户是否登录。我设法从redis获取了会话数据,但我不知道如何解释它们以检查用户是否登录

下面是我的节点应用程序代码,它检查数据库中是否存在会话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
如何检查用户是否使用节点应用程序登录rails应用程序? 谢谢


编辑:我使用的redis store gem似乎在将会话存储到数据库之前调用了编组方法。因此,我通过重写编组方法绕过了这个问题,并将会话数据存储为JSON格式。它不是很优雅,所以如果您找到更好的方法在rails和node.js之间共享会话,请告诉我。

创建自己的oauth api可能更容易(有一个railscast介绍如何实现oauth)。据我所知,Desive是一个ruby宝石,并不是真正的跨平台,但oauth几乎可以用在任何语言中。您可以添加一个oauth令牌来设计,该令牌应该允许您将该令牌传递给node.js。

您可以轻松地完成这项工作,只需对Rails Cookie Parser for Express library中的index.js方法进行一些调整,就可以在没有Express的情况下使用它

此库使用封送处理npm作为其依赖项

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

,看起来这应该是Ruby的
Marshal.dump(hash_var)
函数的结果。我想你可以找到js代码来阅读这种格式。但是,您的解决方案似乎更简单、更优雅。