【发布时间】: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 之间共享会话,请告诉我。
【问题讨论】:
-
看github.com/vangberg/rack-session-redis/blob/master/lib/rack/… 似乎这应该是Ruby 的
Marshal.dump(hash_var)函数的结果。我认为您可以找到 js 代码来读取该格式。但是,您的解决方案似乎更简单、更优雅。
标签: ruby-on-rails node.js authentication devise redis