2015-10-04 155 views
3

我有一個簡單的問題,我有使用我的PHP REST API的js應用程序(前端)。我需要實現簡單的基於令牌的身份驗證,我不確定這應該如何工作,因爲我不使用REST中的會話。從我understaning它是這樣的:在REST API中驗證令牌

  1. 用戶嘗試登錄時,如果有效憑據,我生成令牌

  2. 令牌,並返回用戶對象我更新數據庫用戶令牌

  3. 客戶端保存用戶對象在Cookie或本地存儲而不是會話,並且每個請求都在標頭中傳遞令牌

  4. 我檢查數據庫中是否有令牌,如果有(我知道哪個用戶是發送請求)我繼續請求,否則我發送他登錄頁面

  5. 如果令牌過期或用戶註銷,我更新數據庫中的標記字段與NULL或空字符串(不知道這是否需要)。

我只是需要確認,如果這是好的方法或我誤解協議中的東西。 謝謝大家提前

謝謝

回答

4

我不認爲這種方法是無狀態的。令牌的存在表示登錄狀態。這意味着客戶端狀態的一部分由服務器維護。換句話說,服務器上的令牌計數由客戶端會話增加。

從客戶端到服務器的每個請求都必須包含所有必要了解該請求的信息 ,而不能在服務器上執行任意 存儲方面的優勢。因此會話狀態在客戶端完全保持爲 。 - Fielding - REST - stateless

我寧願做這樣的事情:

  1. 在第一身份驗證發送用戶名和密碼,並返回一個令牌服務器簽名的元數據。
  2. 每隔一個請求發送令牌,以便服務器能夠驗證簽名並使用元數據,其中可以包含例如用戶ID,到期日期等...
  3. 更新標記前它到期。
  4. 定期更新簽名機制的私鑰。
  5. 使用內存緩存緩存認證和授權數據。我認爲db太慢了。請注意,整個過程必須在沒有緩存的情況下工作。因此,如果清除緩存併發送另一個請求,並且由於緩存丟失而無法工作,那麼它違反了無狀態約束。

這樣你就可以避免在服務器上存儲令牌(以及客戶端狀態)。不是一個完美的解決方案(例如令牌可以在過期之前被其他人使用),但它是無狀態的。我不確定您是否真的需要基於REST或基於令牌的身份驗證。 (請注意,這些適用於人機對話通信,機器對機器通信的授權通常不同。)

0

無國籍。這意味着REST服務器不會以會話或任何其他形式存儲有關客戶端的任何狀態。

我個人對應用程序使用了類似的東西,這是您可以擁有的最簡單的安全形式。

當我們的系統用來頒發訪問令牌時,它也隨之創建了有效日期/時間。每次您使用特定訪問令牌撥打電話時,其有效日期/時間更新+ n小時