由於接口地址的暴露,導致數據的丟失,所以必須做一些信息驗證,所以添加授權碼sign是一個很好的解決方法,話不多說,直接開幹!
加密解密算法是需要服務端驗證通過後將加密解密方案告知客戶端。
我這裏介紹對header頭中的信息(version,app_type等)字段進行AES加密,最後在進行sign有效期驗證,以及唯一性驗證。
操作步驟
- 客戶端生成sign,在http請求傳值sign,app_tyoe,version
通過http_build_query生成url_encoded字符串。 這裏data數組模擬爲客戶端發送過來的數據 $data = [ 'sign' => '1213313132', 'app_type' => 'ios', 'version' => 1.1 ]; $str = http_build_query($data); $sign = (new Aes())->encrypt(); //通過Aes加密算法得到sign // 這裏aes類通過網上可以得到 http請求將sign,app_tyoe,version值傳遞到服務端。
- 服務端進行sign驗證
服務端通過約定的方法進行對應的AES解密 $header 爲header頭中的數據(array)。 $sign = $header['sign]; $str = (new Aes())->decrypt(); // 通過Aes解密算法得到url_ecoded字符串 parse_str($str, $arr); // 對sign進行驗證 if($arr['app_type']!= $header['app_type] || $arr['version']!= $header['version]){ return false; //表示 sign驗證不合法 }else{ return true;//表示sign驗證合法 }
- 可以對sign進行有效期驗證以及唯一性驗證
客戶端在header頭信息中添加時間戳信息
服務端對時間進行驗證,如果超過預訂的有效期,則終止http請求$data = [ 'sign' => '1213313132', 'app_type' => 'ios', 'version' => 1.1, 'time' => '1568778577', ];
進行唯一性驗證:對sign唯一性,可以通過緩存文件、mysql、redis保存,這裏我使用文件進行緩存if(time()-$arr['time]>600){ //如果超過10分鐘,則終止請求 return false; //表示請求超時 }else{ return true;//表示請求未超時 }
在進行sign驗證之前進行減產緩存文件是否存在,存在,則sign失效,不存在,則進行之後的驗證,並生成緩存文件。
相關連接:APP登錄之access_token詳解
結論
我這裏只進行了簡單的方法講解,在實際過程中需要完善和驗證的信息仍需要很多。
如果您對這個文章有任何異議,那麼請在文章評論處寫上你的評論。
願大家都能在編程這條路,越走越遠。
朋友不是玻璃做的,有許多人總是把朋友當做玻璃,小心翼翼的怕碰壞了。有時候,明明對朋友很不滿,卻不敢表達出來,害怕一旦表達不滿,就會發生衝突;一旦發生衝突,就會傷害感情;一旦傷害感情,就失去這個朋友。真正的朋友不是玻璃做的,如果朋友真的像玻璃一樣不許你碰,這樣的朋友破了就破了吧。