api使用簽名+時間戳鑑權
請求api接口格式:/api/testserver?appid=xxx&sign=12AA12SD123SD1DSSA×tamp=1511332935&key1=value1&key2=value2...
參數解釋:
appid: 由服務端分配唯一標示id 必傳 確認訪問身份
timestamp:當前時間戳 必傳 確保訪問實效性(10位的秒級時間戳)
sign:簽名 必傳 驗證接口安全防止被劫持修改參數
notice:隨機數 必傳 防止接口重複提交
簽名生成規則:
所有請求參數(包括appid,時間戳,隨機數 )根據key值的字母升序排序後,以key1value1key2value2。。。的方式連接在最後加上secretKey(由服務端分配唯一的加密參數,ps:不參與通信)組成的字符串
使用MD5加密轉爲大寫得到sign(簽名)
因爲secretKey在求情過程中不參與通信,服務端通過對sign的 校驗就可以防止接口被劫持修改參數,再加上時間戳保證接口的實效性。
服務端驗證簽名和時間戳有效後,將sign和notice存入緩存。
請求實例:
如要請求的api爲 /api/getUserWalletInfo
api需要傳的參數爲:userId
step1:生成時間戳 String timestamp= String.valueOf(new Date().getTime() / 1000); // 當前時間的時間戳
step2: 根據參數生成sign
String sb= appidxxxtimestamp1511332935userId1000secretKey
然後對sb進行md5加密轉爲大寫 得到sign
step3:組合訪問參數進行http請求:/api/getUserWalletInfo?appid=xxx&sign=12AA12SD123SD1DSSA×tamp=1511332935¬ice=2332&userId=100
服務端驗證邏輯:
先驗證appid是否合法(不合法返回400),時間戳是否有效(過期返回400),緩存中sign對應的notice是否存在(如果存在代表重複提交,如果不存在將sign和notice存入緩存。),再驗證sign時候正確(不正確返回400)
簽名生成與校驗移步:點擊打開鏈接