2016-04-08 71 views
1

我有以下設置:身份驗證對外部服務器的CouchDB用戶

    存儲用戶和處理身份驗證
  1. CouchDB的數據庫;創建每個用戶1分貝
  2. 使用PouchDB同步,並通過身份驗證
  3. 的Web應用程序pouchdb-authentication
  4. 從Web應用程序獲得的請求和訪問CouchDB的

現在REST API服務器中,REST API具有管理員權限到CouchDB,所以當它收到請求時,它需要進行某種形式的認證,以確保發件人有權訪問他聲稱有權訪問的數據庫。由於我使用永久會話,因此Web應用程序始終不知道用戶密碼(除非將其存儲在localstorage中 - 顯然是一個壞主意)。會話Cookie是HttpOnly,所以我無法訪問它。

在這種情況下驗證API請求的最佳方式是什麼?

+0

是沙發的REST層部分還是它是一個獨立的堆棧,即Java/Tomcat或PHP/Apache等? – Harry

+0

@哈里獨立堆棧(Rust)。 – jgillich

+0

這使事情變得更容易。 – Harry

回答

1

加密您需要的所有內容,並將其作爲base64會話添加到cookie中。以下是序列...

1. WebApp: Send username and password 
2. REST: Authenticate this using couch. 
3. REST: Encrypt the session along with username password and create cookie, then base64 result. 
4. REST: Send cookie to WebApp. 
5. WebApp: Alway sends cookie back to REST layer. 
6. REST layer has everything it needs to authenticate the user. 

在上面的REST層將狀態傳遞給WebApp,它從WebApp中獲得所需的狀態。客戶端無法解密它,因此它很安全。然後,客戶端將該令牌作爲cookie傳遞迴REST層,然後使用該層獲取需要進行身份驗證的詳細信息。

您可以很容易地加密幾百個字節,不會遇到任何標頭或Cookie大小限制。不要在加密之前或之後對它進行壓縮,出於安全原因以及之後的 之前,因爲加密後的數據壓縮不好。如果任何人擔心表現,那麼就會對它進行基準測試,但我已經使用了比Rust更慢的語言。上面的一個變種是使用memcached ie ...

1. WebApp: Send username and password 
2. REST: Authenticate this using couch. 
3. REST: Store Couch session in memcahed along with username password and create cookie. The cookie is the key to memcached. 
4. REST: Send cookie to WebApp. 
5. WebApp: Alway sends cookie back to REST layer. 
6. REST: Get details from memcached. 

我已經使用這種技術使用標題和cookie,它的工作就像一個魅力。我假設你正在使用的東西,以防止XSRF等

你可以混合和匹配以上,以滿足您的應用需求。