2013-05-02 133 views
2

我一直在尋找這個問題的答案,但它看起來像沒有人這樣做。想象一下你正在設計一個JavaScript REST客戶端,並且你想創建一個登錄頁面。當然,登錄後你會被認證。JavaScript REST客戶端和會話管理

因此,對REST API的以下請求將取決於您當前的用戶ID,應該按照RESTful方式存儲在客戶端。

我的問題是如何使用Javascript存儲這個「會話」信息。我研究過餅乾,但在我看來,太多純文本讓人信任。同樣使用cookie可以在那裏存儲映射到服務器上的用戶信息的會話ID,但是這違反了REST中的無狀態概念。

哪個最好的方法來解決這個問題?

+1

請參閱http://stackoverflow.com/questions/6068113/do-sessions-really-violate-restfulness瞭解REST和狀態的極佳解釋。 – potatosalad 2013-05-02 04:53:15

回答

1

我們也在構建類似的架構,其中RESTful API將由JavaScript客戶端訪問。

我們將使用客戶端憑證對客戶端進行身份驗證,並生成身份驗證令牌並將其發送給客戶端。客戶端將它存儲在cookie或本地數據存儲中。來自該客戶端的對API的進一步請求將使用HTTP授權標頭髮送,並在標頭中包含該標誌。我們將在API結束時爲給定的令牌授權請求,並在請求通過驗證後提供服務。

直到n,除非你不訪問服務器端的cookie信息我不認爲這會違反REST的無狀態原則,因爲我們沒有維護客戶端在服務器上的任何狀態(我們只是沒有綁定到任何服務器上服務器)。關於使用令牌的身份驗證過程,我不認爲我們在這裏綁定了服務器和客戶端,因爲我們有多個服務器並使用負載平衡器,並且仍然可以由任何服務器(類似於Google API)提供此請求。

注意:我們正在使用HTTPS協議執行此操作,因此我們確信所有此通信都是安全的。

+0

我明白了,這很有道理,謝謝你的明確答案。但我還有一個問題:想象一下Paul登錄系統。服務器向他發送身份驗證令牌。讓我們想象一下Paul想看到他的個人資料,導致一個API調用,比如/ profile/{paulId}。我們如何將這個ID存儲在客戶端?或者我們使用令牌並將其轉換爲ID? – 2013-05-05 06:47:40

+1

初始認證後,下一個可訪問的URI應該可用於客戶端,服務器應發送該URI。客戶端永遠無法自行生成任何URI來訪問服務器資源。如果是這種情況,那麼你正在打破休息原則(HATEOAS),你的服務器無法修改資源狀態。閱讀關於HATEOAS。在上面的情況下,你的服務器應該給所有的URI進一步處理,包括URI到這個用戶配置文件,這取決於你的應用程序狀態後認證。 – JPReddy 2013-05-05 17:44:27

+0

你說得對。我來自RESTful Java框架不支持HATEOAS的「時間」,所以我完全忽略它。 – 2013-05-06 00:14:31