2016-04-12 84 views
0

我知道的存儲和驗證用戶登錄信息的方法有兩種:驗證和存儲的node.js用戶登錄信息的最有效的方法

  1. 在服務器端的會話存儲的用戶ID,然後當有人打電話給服務器檢查他們是否有用戶會話。 (使用節點客戶端會話)

  2. 當用戶登錄,用戶客戶端本地存儲在用戶的表中的認證令牌並存儲令牌爲好。然後,當用戶調用服務器時,他們將身份驗證令牌作爲標頭髮送,並檢查令牌是否在用戶表中。

儘管這兩種方式都是可行的,適用的,我跟他們兩個的問題/問題:

  1. 有人告訴我,在會話中存儲的信息違背了REST API的想法自動擴展性。這是真的嗎?有沒有辦法解決這個問題?

  2. 當存儲認證密鑰,你不會只能夠一個鍵/實例存儲每個用戶。如果你想要在兩臺計算機或客戶端上登錄相同的帳戶(我知道我可以創建一個認證表,但是如果客戶端丟失了一個令牌並且認證令牌永遠留在認證表中),你會怎麼做。

如果有更好的方法可以做到這一點,請把它提出來,但我很困惑我們朝哪個方向前進。我傾向於第二種方式,但我仍然喜歡第一種方式。

編輯:我已經縮小到智威湯遜和我的第二個想法。我不知道哪個節點會更好。

回答

0

JSON Web Tokens怎麼樣?它們是您提到的第二種方法的變體,並且是公認的行業標準,因此您可以輕鬆找到堆棧的實現。

您可以將令牌存儲在key-value存儲Redis的一樣,而不是一個關係型數據庫,這將是快得多。 Redis還支持一段時間後關閉一個密鑰,因此過期的令牌會自動消失。您也可以進行設置,以便每個令牌在使用後都會失效,並且對API的任何請求都會返回一個新令牌供下一個請求使用,從而允許用戶不斷刷新令牌。

0

假設您使用快遞,您可以使用express-session來管理您的會話。然後,您需要添加合適的session store而不是缺省的MemoryStore,它僅用於調試,並且不會擴展到多個流程實例(出於您在問題中提到的原因)。

FRO例如,如果您使用的是PostgreSQL數據庫,你可以考慮使用connect-pg-simple。這會將您的會話存儲在數據庫中,以便您的會話管理不會阻止您擴展node.js服務器。此外,您可以爲每個用戶存儲多個會話,這些會話將根據您配置的maxAge過期(並自動刪除),從而解決您提到的第二個問題。

相關問題