我們有一個非常標準的場景 - 通過HTTP POST和GET與後端PHP服務器API進行移動應用程序通信。用戶必須在移動應用程序中登錄才能執行任何操作,因此每個從移動應用程序到我們服務器的請求都需要使用用戶憑據進行簽名。用戶名和密碼在成功登錄後保存在移動應用內部設置中,因此用戶不需要再次重新輸入。如何使用移動應用和後端服務器通信的用戶憑證簽署HTTP請求?
以前,後端PHP webservices是由其他人開發的,但現在我們需要自己實現它。在查看以前的項目時,他們需要爲每個請求傳遞用戶憑據。我在下面發佈了幾個請求示例。所有數據插入/更新Web服務都使用POST,但userid和pwd與其他數據(Save Car)一起傳遞到主體內部。所有數據選擇服務都通過GET參數傳遞用戶標識和密碼。
這是最好又安全的方法嗎?也許我們應該將sha1(userid + password = salt)放入HTTP授權標頭中,並將userid留在正文中(因爲我們需要從服務器中的數據庫中選擇用戶傳遞)?或者,也許我們可以在移動應用程序中使用OAuth 2對HTTP請求進行簽名(生成userid + pass + ...授權標頭),並在後端使用OAuth 2生成相同的哈希並檢查它是否相同?我無法找到任何直接的方式如何使用PHP的OAuth 2來簽署請求,所以任何幫助將不勝感激:)此外,有關哪些庫用於iOS/Android開發的相關信息也將受到讚賞。
LOGIN
HTTP method: POST
URL: http://mybackend.com/login
BODY:
{ "uid" : 123,
"pwd" : "3CB3E2E6AECA48C41000119767B561F5E9E66229" // contains sha1(pass+salt)
}
GET汽車榜單
HTTP method: GET
URL: http://mybackend.com/getCars?uid=123&pwd=3CB3E2E6AECA48C41000119767B561F5E9E66229
SAVE CAR
HTTP method: POST
URL: http://mybackend.com/saveCar
BODY:
{ "uid" : 123,
"pwd" : "3CB3E2E6AECA48C41000119767B561F5E9E66229",
"car" :
{ "id" : 111,
"name": "My car"
}
}
POST方法...看看我的答案... http://stackoverflow.com/questions/15377212/get-the-password-from-the-webservices-url-and-access-through-that-密碼/ 15377242#15377242 – iPatel 2013-04-04 10:04:18
我建議在授權標題中使用授權密鑰。您可以在用戶登錄時生成此密碼,然後將其用於任何其他請求。如果使用這種方式,則不必再將用戶標識放在主體中,因爲授權密鑰和用戶標識之間會有一對一的關係,因此,如果授權密鑰有效。 – Cosmin 2013-04-04 10:54:10
@Cosmin我認爲這個授權密鑰是一個類似的概念訪問令牌?在這種情況下,令牌還需要有一些到期日期。 – Centurion 2013-04-04 11:28:24