2012-12-04 65 views
1

我正在PHP中構建REST Web服務,旨在與iOS和Android等移動設備配合使用。基本上,GET請求用於返回JSON數據和請求的結果,POST和DELETE請求用於向服務添加數據。移動Web服務身份驗證

基本上,我需要實現一個用戶登錄/認證系統,這樣當用戶請求特定的數據給他們,喜歡他們自己的東西列表,或者他們嘗試添加數據,他們需要登錄。

我知道我需要使用SSL來保護註冊和身份驗證,但我想避免重新發明。我正在尋找這樣做的解決方案?任何建議將不勝感激! 謝謝!

回答

5

如果您正在構建一個真正的REST Web服務,那麼您不能擁有會話 - 即讓用戶登錄一次,然後服務器記住會話以及使用該會話的用戶進行每次後續呼叫。對於REST服務,服務器不會記住「狀態」。

每個狀態可以通過表示(一個或多個)它 包含與所述一組轉換的,它提供完全理解,與 轉變限制爲均勻的組動作是可以理解的。

(來源:http://tech.groups.yahoo.com/group/rest-discuss/message/5841

這實際上使你的工作更容易,因爲每次調用服務器必須配有一個唯一的標識符來驗證用戶。您的選項包括髮送用戶名/密碼組合,密鑰和其他引用以識別用戶,或者可能兩者都有。因此,當用戶「登錄」時,您可以記住他們的詳細信息客戶端(即以JavaScript形式或通過您的應用程序記住,並記憶在本地存儲中用於iPhone/Android),然後將這些詳細信息與每個呼叫一起發送。您可以使用休息電話來驗證登錄詳細信息,但它贏了;返回會話。

因此,爲了與pseduo代碼回答:

  1. HTML:用戶登錄。表單被Javascript困住,用戶名/密碼(或其他密鑰)被javascript記住,或者
  2. iOS/Android:用戶登錄。表單被代碼困住並且在本地存儲器中被記住
  3. [可選]發送用戶名/密碼/祕密密鑰到您的「WhoAmI」web服務:如果有效,您會收到回覆。如果無效,則發送錯誤。這可以提供即時反饋
  4. 與其他任何呼叫一樣,您還會向您的web服務發送用戶名/密碼/密鑰:如果有效,您處理該呼叫,如果無效,則會發出錯誤。
  5. (在出錯時,您要求用戶輸入新憑據)。

PHP端很簡單:每一個通話將讀取:

  1. 如果沒有用戶名/密碼/密鑰:拒接來電
  2. 查找用戶名/密碼/密鑰數據庫。如果無效:拒絕呼叫
  3. 如果有效:處理剩餘呼叫 - 您有用戶的詳細信息。

顯然,你也可以使用不需要認證的服務;這可能包括註冊。

+0

非常感謝。獲得大部分工作:) 現在,對於測試和開發,我通過直接HTTP使用它,並在部署時遷移到HTTPS(SSL)。 我的一個擔心是因爲我將發送帶POST消息的證書來驗證用戶是否可以添加內容,這些消息必須使用SSL進行保護。其中一些POST表單中包含圖像和文件。我不熟悉這樣做,我理解通過SSL編碼文本/數據,因爲它不是很多實際數據。但是,通過SSL正常實踐來編碼整個圖像或文件? – dbrateris

+0

如果你有在ssl下提供的HTML,那麼你還需要由ssl提供的圖像。網頁越來越普遍,以防止eves隨無線網絡而下降,所以現在沒有什麼我擔心的,除非你對帶寬/服務器CPU非常擔心。 – Robbie

+0

謝謝。似乎我不應該擔心它。 - 爲了清楚起見,這不是我提供的網頁,而是像iPhone一樣的移動設備上傳的圖片數據。 謝謝! – dbrateris

0

捆綁Oauth消費者密鑰和祕密的客戶端應用程序。使用Oauth 1授權標頭爲HTTPS請求籤名。通過oauth庫,現在的簽名很容易。

對於web應用程序,沒辦法。