2013-04-16 81 views
4

我有一個rails應用程序和一個node.js應用程序,我使用Devise來認證用戶。我將會話存儲在Redis中。現在,當用戶轉到節點應用程序時,我希望該應用程序通過socket.io檢查用戶是否已登錄。我設法從redis獲取會話數據,但我不知道如何解釋它們以檢查用戶是否已登錄。rails和node.js與redis商店之間的共享認證

這是我的代碼,用於檢查數據庫中是否存在_session_id,檢索會話DATAS:

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的商店寶石,我使用數據庫中存儲會話之前調用編組方法。所以我繞過了這個問題,重寫了編組方法並以JSON格式存儲了會話數據。這不是很優雅,所以如果你找到一個更好的方式來共享rails和node.js之間的會話,請讓我知道。

+0

看着https://github.com/vangberg /rack-session-redis/blob/master/lib/rack/session/redis.rb它看起來應該是Ruby的'Marshal.dump(hash_var)'函數的結果。我想你可以找到js代碼來閱讀這種格式。但是,您的解決方案看起來更簡單,更優雅。 – nimrodm

回答

2

創建自己的oauth api可能更容易(有關如何執行oauth的railscast)。據我所知,devise是一個紅寶石,並不是真正的跨平臺,但oauth幾乎可以用於任何語言。您可以添加一個oauth標記來設計哪個應該允許您將該標記傳遞給node.js.

+0

您也可以嘗試使用JSON Web令牌(請參閱http://jwt.io瞭解更多詳情) –

0

您可以輕鬆地對Express https://github.com/instore/rails-cookie-parser庫的Rails-Cookie-Parser中的index.js方法進行一些調整,以便在不使用Express的情況下使用它。

此庫使用元帥故宮作爲其依賴

注意:您可能需要decodeURIComponent(「cookie值」),因爲原來的cookie被URL編碼