在前后台數據交互的時候,通過使用給Json添加token驗證的方式來保證自己的接口不會被其他人調用並通過在返回字符串中添加token信息和時間戳的方式來保證接口的安全.
token是存放在服務器中的一個以 < K, V > 形式存放的字符串,在用戶登錄成功后,后台通過以唯一Id為基礎(如userId)自動生成隨機數的方式生成一個key(如RedisTokenManager.createToken(user.getId()))存放到K中,V則是存放了后台唯一字符串(當前為userId),這樣后台就自動生成了一個Token對象,登錄成功后每次數據驗證都把Token對象放進去以進行校驗,此時,還要對token對象進行設置超時時間,當一段時間客戶端無響應的時候,服務器會自動清除服務器的token對象,讓用戶重新登錄.
對於前台數據驗證:
在前台傳到后台數據的時候,除了添加用戶名和密碼等數據外,還要將token和Timestamp信息也傳入到json中一起傳到后台,以便於后台信息的校驗.
如何保證信息不被泄露:
在傳輸的過程中通過對數據進行加密驗證 , 生成唯一的sign值,當任何人非法修改傳遞的參數的時候都會導致sign值不匹配從而造成驗證失敗.因為sign值是MD5加密而且是唯一的,參數修改會導致驗證不通過.
1.sign的生成方式:
將傳入數據按照某種規則排序,如按照字母順序排序,然后全部轉成大寫,我們在做移動端校驗的時候會有一個和服務器端相同的密匙,有這兩個數據后將密匙添加到轉換后的數據前面,然后再對數據進行MD5加密,這樣就生成了一個token對象.
2.Timestamp類:
就是將當前的時間傳到后台,用來驗證數據是否超時,防止數據被盜取,這個是請求超時時間,防止被其他用戶獲取到地址並進行其他操作.
舉例:想要傳入如下數據:
我們的密匙是“@#¥213345RTRDG&&”
① 先對傳入數據排序:a=entrr&b=123&token=wdeeskfh2376428×tap=1237549754676
② 對數據大寫轉換A=ENTRR&B=123&TIMESTAP=1237549754676&TOKEN=WDEESKFH2376428&TIMESTAP=1237549754676
③ 將密匙添加到轉換成大寫的字符串前方:@#¥213345RTRDG&&A=ENTRR&B=123&TOKEN=WDEESKFH2376428&TIMESTAP=1237549754676&TIMESTAP=1237549754676
④ 進行MD5加密生成sign.將sign放入json中,讓后台首先對sign驗證.
后台驗證流程:
- 判斷返回參數是否有token,Timestamp,sign 這些參數,如果沒有直接返回錯誤.
- 判斷此URL是否過期,如果過期返回錯誤.
- 把除了sign的參數進行排序並大寫,然后把秘鑰拼接再排序之后的請求參數之前進行MD5和傳過來的sign值進行比對 如果不一致返回錯誤.
- 根據token 取出來userID,如果取不到,說明token 過期,返回數據,讓用戶重新登錄.
- 如果驗證通過,則表示返回的數據是安全的,繼續進行下一步操作.
