2015-04-01 73 views
0

我想登錄到Laravel5編寫的RESTful後端服務器,單頁前端應用程序利用Polymer的自定義元素。如何在Polymer SPA中保留後端會話信息

在這個系統中,持久性(CRUD)層位於服務器中。所以,認證應該在服務器端響應客戶端的api請求。當請求有效時,服務器以JSON格式返回User對象,包括用戶在客戶端的訪問控制角色。

在這裏,我的問題是我如何保持會話,即使用戶刷新前端頁面?謝謝。

回答

1

這是聚合物以外的問題,甚至只是單頁面應用程序。問題在於如何在瀏覽器中保留會話信息。使用SPA時,它會更容易一些,因爲您可以將身份驗證令牌保存在內存中,但傳統的Web應用程序自一開始就有此問題。

你有你需要做兩件事情:

  1. 令牌:您需要一個用戶標記指示出該用戶進行身份驗證。你希望它成爲不可猜測的東西,否則有人會欺騙它。所以這個標誌最好不要是「jimsmith」,而應該更可靠。你有兩個選擇。您可以擁有服務器存儲的隨機生成的令牌,以便在將來的請求中提供該令牌時,可以驗證該令牌。這就是大多數會話管理器在nodejs會話或Jetty會話等應用程序服務器中的工作方式。另一種方法是執行加密操作,以便服務器只需數學驗證,而不檢查存儲以查看令牌是否有效。我在http://github.com/deitch/cansecurity中爲節點做了這個,但是它有很多種選擇。
  2. 存儲:您需要某種方式來存儲不依賴JS內存的令牌客戶端,因爲您希望重新加載頁面。

有幾種方法可以做客戶端存儲。目前最常見的是餅乾。由於瀏覽器存儲它們時沒有太費勁,只要訪問cookie註冊的域名就可以顯示它們,這很容易實現。許多客戶端和服務器端auth庫都是圍繞它們構建的。

替代方案是html5本地存儲。根據您的目標瀏覽器和支持,您可以考慮使用它。

還有一些方法可以使用URL參數進行播放,但當有人切換頁面時,您可能會失去它。它可以工作,但我傾向於避免這種情況。

我還沒有看到任何直接處理cookie的組件,但建立它不應該太難。

這是我用於最近的應用程序的cookie管理代碼的要點。隨意包裝它建立一個cookie組件管理..只要你共享相同!

https://gist.github.com/deitch/dea1a3a752d54dc0d00a

UPDATE:

component.kitchen在這裏有一個存儲組件http://component.kitchen/components/TylerGarlick/core-resource-storage

+0

感謝您的解釋和建議。 我明白了。 - ** option1 **:當index.html被命中以重新填充用戶對象*時(只有當它被刷新命中時),客戶端必須發出api請求。 - **選項2 **:客戶端必須將用戶對象存儲在特定時間的某個地方。 – appkr 2015-04-02 13:26:16

+0

很高興。很多,是的。我必須在接下來的幾周內將一個Angular應用程序轉換爲Polymer,客戶端存儲是其中的重要組成部分,因此我們將看到它在現實世界中的表現如何。 – deitch 2015-04-02 13:50:31

0
如果您使用PHP是讓用戶在PHP會話(像一個正常的非SPA應用

的最簡單方法)。 PHP會將用戶信息存儲在服務器上,並自動生成一個瀏覽器隨任何請求發送的cookie。使用一臺沒有負載平衡的服務器,會話數據是本地的,速度非常快。

+0

謝謝!你是對的。我發現,即使是api請求,一旦登錄到服務中,會話變量將通過COOKIE傳遞,並在Laravel 5中保留兩個小時。因此,只要有後續的api請求服務器在兩個小時內,COOKIE延長其使用壽命。 – appkr 2015-04-02 13:05:49

+0

但是,我也發現我寫的題目很差。它應該類似於「在刷新客戶端後保持從後端返回的用戶數據」。這意味着,就api請求而言,一旦客戶端得到認證,就沒有限制做出另一個api請求。但是從服務器返回的用戶對象不見了。 – appkr 2015-04-02 13:12:43

+0

我想有兩種簡單的方法可以做到這一點: - 服務器端:如果你的服務器主要是做REST請求,你可以在你的html頁面直接在onload事件中發送用戶對象,如果用戶連接的話:(在你的內部html模板,使用類似window.onload = function(){user = {'從服務器生成的JS代碼是一個用戶連接'};} 我不知道Laravel,但如果你有某種模板引擎它可以在用戶連接的每個HTML頁面上顯示一些JS,它可以工作在 - 客戶端有會話存儲(僅限HTML5瀏覽器)。詳細信息請參閱deitch msg – BLASTOR 2015-04-03 22:06:26