最近在做的兩個項目,都需要使用Restful Api,接口的安全性和訪問控制便成爲一個問題,看了一下別家的API訪問控制辦法。
在stackoverflow上Simone Carletti 提出了兩種解決方案:
1. 使用一個基礎HTTP認證,GitHub使用的就是這種方法,發送給指定URL的請求應該包含認證信息
http://api.example.com/resource/id
with basic authentication
username: token
password: the api key
這種方式的缺點十分明顯,就是針對HTTP類型的請求,所有的信息都會暴露在外面,很容易就被破解掉,Github使用這種,是因爲Github全站HTTPS了。
2. 將API Token作爲一個查詢參數傳遞過去,發送給指定URL的請求如下http://api.example.com/resource/id?token=api_key
這種方式的缺點類似上面那種方法。
回答中提出了還有三種方法:
1. using an API key in the header (e.g. 'Authorization: Token MY_API_KEY') instead of as a url param. 在HTTP頭裏面存儲token
2. 亞馬遜的解決方案,加入了簽名的TOKEN,即在客戶端用密鑰和id簽名出一個token,然後傳遞token,到服務器端再次簽名,這樣由於密鑰並沒有在網絡上傳輸,基本安全的,同時亞馬遜還使用了時間參數防止重放攻擊
——http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html
3. OAUTH認證,這種需要輔以用戶賬號系統,通常涉及到服務器,客戶端和用戶三方的認證,即用戶對這次請求進行認證。
原始鏈接如下:
http://stackoverflow.com/questions/4968009/api-design-http-basic-authentication-vs-api-token
研究新浪的API訪問控制,發現它使用的是AccessToken,有兩種方式來使用該AccessToken:
1、API請求 URL 的後面加上一個AccessToken
2、Http頭裏面加一個字段AccessToken=xxx
這種AccessToken是寫死在程序裏面的,在每次請求的時候附帶上,對於這種AccessToekn新浪那邊有過期時間,過期之後就無法再使用了。
很明顯這種方式是不安全的,一旦別人獲取到這個AccessToekn 就可以僞裝身份使用該API,這個訪問控制就形同虛設了。但是新浪也知道這一點,所以利用這種方式使用的接口都是較爲基礎的接口,高級一點的接口需要使用Oauth 2.0進行二次認證的訪問控制。
在我的項目中,沒有像新浪微博賬號這種的用戶管理系統,做OAtuth認證不太合適,通過參考網上大神的資料,大致想了下面這種訪問控制的辦法。
1、爲每個應用頒發一個賬號(user)和密碼(password),相當於(公鑰和私鑰)。
2、服務器後臺存儲該賬號和密碼(密文存儲 MD5加密)
3、應用端在通過HTTP請求該接口的時候,需要在HTTP HEADER 附帶下面幾個字段
- 時間date=unix時間戳
- 簽名sign=sign