2013-04-04 20 views
2

我們有一個非常標準的場景 - 通過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" 
    } 
} 
+0

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

+1

我建議在授權標題中使用授權密鑰。您可以在用戶登錄時生成此密碼,然後將其用於任何其他請求。如果使用這種方式,則不必再將用戶標識放在主體中,因爲授權密鑰和用戶標識之間會有一對一的關係,因此,如果授權密鑰有效。 – Cosmin 2013-04-04 10:54:10

+0

@Cosmin我認爲這個授權密鑰是一個類似的概念訪問令牌?在這種情況下,令牌還需要有一些到期日期。 – Centurion 2013-04-04 11:28:24

回答

0

我可能會問,如果用戶可以更改passwo rd在應用程序然後它是更新密碼與保存在應用程序代碼?

更好的發佈數據的方法是創建access_token的目錄並在其中使用userid和password。 如實施例: { 「的access_token」:{ 「UID」:123, 「PWD」: 「3CB3E2E6AECA48C41000119767B561F5E9E66229」 }, 「saveCar」:{ 「ID」:111, 「名」 :「我的車」 }}

,並在服務器端PHP代碼很容易與此通過數據庫檢查,並允許您訪問做save​​Car數據庫的accessToken訪問您的所有網址。 其他從服務器端您將有錯誤消息,因爲訪問無法登錄再次嘗試登錄。 並在所有請求中以post方式使用它。 將會對安全類型有好處。 POST方法是一種用於PHP數據安全性的方法。 沒有其他的事情你需要這個。

而不是使用汽車名單GET HTTP請求,您可以發佈訪問令牌的網址爲

{ 「的access_token」:{ 「UID」:123, 「PWD」:「3CB3E2E6AECA48C41000119767B561F5E9E66229 「, } } 添加到Carlist的URL中。 http://mybackend.com/getCars從該帖子的方法中,爲該帖子方法的結果所做的代碼返回汽車列表。

謝謝,希望這個描述可以幫助你。

相關問題