2014-03-26 242 views
1

我很抱歉在網站上放置了另一個REST身份驗證問題,但我真的需要得到一個完整的答案。我有一個REST API,我嘗試登錄單個頁面網站(通過jQuery)。PHP REST API - 身份驗證

我想創建一個基於令牌的身份驗證,但有一些步驟我仍然無法理解。

首先,我必須做一個正常的身份驗證來獲取和存儲數據庫的用戶登錄名/密碼? 我是否必須使用用戶會話來存儲令牌? 有人有我可以使用的PHP代碼的例子嗎?

源:

----------- --------------- EDIT

好吧,我有一些消息要補充。

  • 首先,是的,我有通過發送一對登錄,SHA1(登錄+ passwd文件)
  • 後,沒有,從來沒有使用像一個安全的方式會話存儲數據,登錄,使正常的認證和sha1(login + passwd)將存儲在數據庫或應用程序範圍存儲解決方案中,如haspmap。
  • 但我仍然需要你,如果你有一塊PHP代碼。這就是爲什麼我把我的答案作爲編輯的原因。

回答

3

哦,我只是看到徽章「沒有看法,沒有很長時間的答案」,它把我帶回了這裏。 我終於找到了答案:

寄存器是你只做一次,所以你可以發送散列鍵沒有一個很好的保護。 (我的意思是反對嗅探)。

因此,這裏是註冊的場景:

  • 客戶端輸入登錄名和密碼
  • 客戶端發送的登錄,散列(SHA256(登錄+密碼))
  • 服務器存儲這對數據庫(您可以緩存它HashMap來提高速度)

現在的登錄

  • 客戶端:通過html頁面中的休息服務或隱藏字段請求會話salt。
  • 服務器:生成從日期時間和隨機和存儲該鹽在會話
  • 客戶端輸入登錄名和密碼
  • 客戶機JavaScript散列SHA256(SHA256(登錄+密碼)+鹽),並存儲在一對(登錄,散列)在localStorage的(HTML5,要小心,以近代化或其他這樣的東西,這對需要的,如果(SHA256(stored_hash_for_login + salt_in_session到留民營)
  • 服務器檢查)收到==哈希)
  • 服務器:如果它確定存儲與客戶共享的令牌
  • 客戶登錄

現在每當客戶想要做一個身份驗證請求時,他會用下面的方法:

  • 獲得對(登錄,令牌)從localStorage的
  • 生成一個散列就像要求這個:
  • hash_request = sha256(login + sha256(token + timestamp)+ sha256(token + paramA)+ ...)
  • 參數需要按字母順序排列。

服務器收到請求(登錄,時間戳,則params,hash_request),檢查時間戳是否不太舊的和做的產生從HashMap中的登錄標識中的hash_request並檢查它是否是相同的。 通過這種方式,您可以避免重播(時間戳)和清除密碼。

+0

感謝您的回答。 – hardik

+0

這真棒!謝謝! –