2016-02-27 42 views
11

我建立我自己的API:安全我的API與正在使用的API密鑰

1)Android應用程序 2)桌面應用程序

我的一個網址是:http://api.chatapp.info/order_api/files/getbeers.php從我用戶通過JSON從我的數據庫中獲取數據。我最近在考慮使用API​​密鑰創建身份驗證。

關於如何做到這一點的任何想法?或者我必須做一些像http://api.chatapp.info/order_api/files/getbeers.php?api_key=之類的東西,然後將GET方法與存儲在我的數據庫中的一些密鑰進行比較?

任何想法?

+0

是你想擁有API密鑰進行驗證,以確保您的數據或者是它只是監控使用情況的主要原因是什麼?有一些簡單的方法可以生成和使用API​​密鑰來監視使用情況,以及更深入的身份驗證方法(如使用OAuth)來保護數據的安全性。 – Mike

+0

我想保持我的數據更安全....我怎麼做oAuth? –

+0

如果這是爲了安全起見,最糟糕的事情就是推出自己的解決方案。使用經過測試的軟件包(如OAuth)總是更好。他們已經修復了你尚未意識到的問題。 – jairbow

回答

2

作爲@mike提到的,OAuth是複雜的API,更重要的是需要在某處運行的第三個服務端點爲訪問提供認證/授權。

一想到你肯定不要想要做的就是在URL中包含API密鑰。這很容易被代理重播和/或欺騙和識別,並在日誌文件中捕獲。更好的解決方案是將API密鑰作爲附加HTTP頭包含在請求中,並在API端點中查找該特定值。

對於一個簡單的用例像你所建議的,你會發現它值得認證與你保持作爲你的Android應用程序和API端點之間的共享祕密的關鍵API調用。如果你採取這種方式,它不容易改變,如果妥協意味着一個真正的PITA可以啓用一個新的密鑰並置入。

如果使用「共享的祕密」,那麼我建議製作相對容易(或至少有一些UI)也爲用戶的更新情況下關鍵它的破壞。我假設你可以很容易地更新你的網絡服務。這個過程並不像OAuth或OAuth2那樣安全,但實現起來更加簡單快捷,同時仍然提供了合理的「安全級別」(在這種情況下,安全性意味着「您可以訪問此API」)。

+0

,如果我去的授權:基本哈希? –

+0

如果遵循此路徑,則可以使用單向散列(如SHA-256)或只是一個純粹的隨機值作爲共享密鑰。我不建議將值設置爲「可解密」(即使用任何類型的對稱密碼),並根據此Q上的其他響應,明確地執行您需要將值遠離日誌的值 - POST中的數據或標題在我上面提出的請求中。 – heckj

+0

如果我用BCRYPT算法使用php的password_hash()會怎麼樣? –

2

OAuth是一個複雜的協議,可以通過谷歌搜索和閱讀文檔更好地學習,但這可能是保護您的API端點的一個很好的選擇。

簡而言之,OAuth是一種讓用戶通過證明允許訪問您的API來訪問您的API的方法,然後使用您提供的安全「訪問令牌」。

  1. 客戶端通過傳遞一個「API密鑰」和某種「祕密鑰匙」的請求從API服務器的訪問令牌。這些提供給您的API用戶在註冊時使用您的API。

  2. 如果從客戶端傳遞給API服務器的憑據是正確的,那麼API服務器會以「訪問令牌」響應。此訪問令牌有一定的時間,並且應該隨後發送所有請求,以證明客戶端已被授予使用API​​的權限。

  3. 客戶端向您的API服務器發出一個API請求數據,並且必須包含「訪問令牌」。如果包含「訪問令牌」並且仍然有效(即尚未過期),則可以用他們請求的數據進行響應。

以下是一些資源鏈接,可幫助您瞭解如何在API中實現OAuth。

OAuth Docs

http://scottksmith.com/blog/2014/07/02/beer-locker-building-a-restful-api-with-node-oauth2-server/ http://www.devx.com/webdev/create-your-own-rest-api-using-oauth-authentication.html

參見this link爲1.0的OAuth和OAuth 2.0的比較,以確定哪個更好你的情況使用。

2

如果你需要認證用戶,那麼我會去與Oauth。如果不是,則將請求參數的加密校驗和添加到自定義請求標頭。