天天看點

一個Restful Api的通路控制方法

最近在做的兩個項目,都需要使用restful api,接口的安全性和通路控制便成為一個問題,看了一下别家的api通路控制辦法。

新浪的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

該sign的生成算法是這樣的

string sign = httpmethod(get/post)+ api_uri(api的通路uri)+date(即上面的unix時間戳)+length(發送body的資料長度)+password(背景頒發的密碼)

sign = md5(sign)

sign = user+":"+sign

4、背景伺服器在接收到請求後

1、比對http頭中的時間戳,比對伺服器時間,如果超過某個門檻值,則拒絕通路,同時傳回請校準你的應用時間。

2、如果沒有超過時間門檻值,則從sign中取出user然後在資料庫中查找對應的password,然後同樣根據上面的sign生成算法,來生成sign進行身份認證,認證成功則執行api,失敗則傳回認證失敗。