2016-09-07 46 views
0

我使用Passport.js本地策略來處理我的應用程序中的身份驗證。我還使用Nodemon在我進行更改時自動刷新服務器。Passport.js無狀態

問題是,每當我做出改變我需要再次登錄到應用程序。目前這只是發展,但同樣的概念將適用於處理請求的多個服務器(例如EC2負載均衡器)。所以我的問題是,如何讓Passport.js無狀態,同時仍然保持用戶的狀態?

好像必須有保存在服務器和/或服務器的重新啓動狀態的方式。

+0

爲什麼這個應用程序完全無狀態很重要?如果你擔心的是你可以傳播國家信息 - 我不太清楚它是如何給你帶來好處的。只是試圖幫助你避免[問XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。 –

+0

在生產中,我計劃使用EC2負載平衡器,以便基本上可以爲每個請求使用不同的服務器,因此即使登錄請求發生在單獨的服務器上,我也需要確保用戶已獲得授權。我不希望用戶每次想要爲每個新服務器發出請求時都必須登錄。然後在開發過程中,每次我做出改變都會變得很痛苦,而且Nodemon會重新啓動服務器以重新登錄。我可能完全錯誤,但似乎幾乎相同的解決方案可以解決這兩個問題。 –

+0

將您的身份驗證相關數據存儲在redis服務器上。因此,服務器重啓將不會刷新您的身份驗證數據,並且Redis服務器上的緩存速度會更快。 –

回答

1

你有兩個選擇:

  1. 使用持久會話存儲例如MongoDBRedis,或者PostgreSQL
  2. 根本不使用會話,使用JSON網絡令牌又名JWT代替。

首先選擇需要較少的設置,如果你已經有了一個共享的數據庫,只是實例存儲和它的應用程序傳遞給你,例如:

const session = require('express-session'); 
const MongoStore = require('connect-mongo')(session); 

app.use(session({ 
    secret: 'foo', 
    store: new MongoStore(options) 
})); 

第二個選項需要像passport-jwt或不同的護照策略也許完全拋棄護照並直接在自定義中間件中使用jsonwebtoken

+0

很棒的細節。非常感謝。 –