【问题标题】:Shared authentication between rails and node.js with redis store使用 redis 存储在 rails 和 node.js 之间共享身份验证
【发布时间】:2013-04-16 17:00:55
【问题描述】:

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

这是我的节点应用程序代码,它检查数据库中是否存在 _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(session) 给我的:

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

如何检查用户是否使用 node 应用程序登录到 rails 应用程序? 谢谢

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

【问题讨论】:

标签: ruby-on-rails node.js authentication devise redis


【解决方案1】:

创建自己的 oauth api 可能更容易(有一个关于如何执行此 oauth 的 railscast)。据我所知,devise 是一个 ruby​​ gem,并不是真正的跨平台,但 oauth 几乎可以在任何语言中使用。您可以添加一个 oauth 令牌来设计它应该允许您将该令牌传递给 node.js。

【讨论】:

    【解决方案2】:

    您可以轻松地做到这一点,只需对 Rails-Cookie-Parser for Express https://github.com/instore/rails-cookie-parser 库中的 index.js 方法进行一些调整,即可在没有 Express 的情况下使用它。

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

    注意:您可能需要 decodeURIComponent("cookie value") 因为原始 cookie 是 URL 编码的

    【讨论】:

      猜你喜欢
      • 2016-01-22
      • 1970-01-01
      • 1970-01-01
      • 2011-01-17
      • 2010-12-20
      • 1970-01-01
      • 2014-08-10
      • 2020-05-18
      • 2019-08-17
      相关资源
      最近更新 更多