2014-12-05 93 views
1

下面的評論an answer about state and REST最近引起了我的興趣。爲了清楚起見,我會引用註釋全:如何進行身份驗證而無需點擊數據庫?

我的回答沒有任何暗示基於每個請求的數據庫訪問的解決方案,如果你認爲這樣做,是你一個不理解的認證和授權在那個規模。身份驗證可以隱含在狀態中,您認爲Facebook對其REST API的每個請求都執行「數據庫訪問」嗎?或谷歌爲此事?提示:任何

我試着想一個可能方式,而不檢查對中央,舉辦一個用戶提供的價值進行身份驗證,即使一個知道什麼數據顯示給用戶,並想出了空白。我坦率地承認,這是我在理解認證和授權方面的失敗。因此,我的問題是:如何像Facebook和谷歌這樣的網站完成這個?

回答

2

一種方式是基於聲明的認證。簡單並且有些鬆散的解釋,可以歸結爲這一點;

  • 取代服務器應用程序對用戶本身進行身份驗證,未經身份驗證的用戶被重定向到單獨的身份驗證服務器。

  • 驗證服務器以任何想要的方式驗證用戶(登錄名+密碼,證書,域成員等),並創建一個帶有相關用戶信息(用戶標識,名稱,角色,......)的簽名「文檔」。 )然後,它將用戶重定向回服務器應用程序並附上文檔。

  • 服務器應用程序驗證文檔的簽名,如果它信任簽名,它可以使用文檔內容來假定用戶是誰而不是訪問數據庫。

  • 通常,服務器應用程序會將文檔緩存到cookie /會話或類似文件中,以便對應用程序的下一次訪問不必通過身份驗證服務器進行反彈。

這樣,服務器應用程序不需要與如何用戶進行身份驗證關心自己,只是它是否信任認證服務器的判斷。如果認證服務器(以及可能的客戶端,除非它是瀏覽器)添加Facebook登錄支持,則服務器應用程序將自動以新登錄類型「正常工作」。

+0

所以這不是數據庫沒有被檢查,它只是認證是從一個不同的數據庫處理?正如我理解你的答案,用戶提供的值仍然是針對數據庫中集中保存的值進行檢查的,但是這是在不同的服務器上進行的,主要是爲了負載平衡。是對的嗎? – 2014-12-07 14:22:50

+0

@GarryCairns不同之處在於數據庫在登錄時被諮詢_once_以生成索賠文檔,之後不再需要數據庫訪問來知道所需的用戶數據,而是索賠文檔(或從其創建的會話)是用來查看它。如果您只使用單個服務器,則可以通過在登錄時從數據庫中讀取一次用戶數據並將結果放入一個會話中,獲得幾乎相同的效果,以便您不需要數據庫訪問權限即可獲取 - 例如 - 用戶名。 – 2014-12-07 14:26:51

+0

沒關係,這是有道理的。謝謝。 – 2014-12-07 14:28:31

相關問題