先聲明一些驗證規則json
protected $request; // 用來處理參數 protected $validater; // 用來驗證數據/參數 protected $params; // 過濾後符合要求的參數 protected $rules = array( 'Login' => array( 'login_join' => array( 'mobile' => ['require','max' => 11], 'password' => 'require|length:6,18', ), ), ); /** * 構造函數 * 初始化檢測請求時間,簽名等 */ public function _initialize() { parent::_initialize(); // 獲取參數 $this->request = Request::instance(); //驗證是否超時 $this->check_time($this->request->only(['timestamp'])); //驗證 $this->check_token($this->request->param()); //驗證參數 $this->params = $this->check_params($this->request->except(['timestamp','token'])); }
定義個返回數據的方法api
/** * api 數據返回 * @param [int] $code [結果碼 200:正常/4**數據問題/5**服務器問題] * @param [string] $msg [接口要返回的提示信息] * @param [array] $data [接口要返回的數據] * @return [string] [最終的json數據] */ public function return_msg($code, $msg = '', $data = []) { $return_data['code'] = $code; $return_data['msg'] = $msg; $return_data['data'] = $data; echo json_encode($return_data); die; }
驗證是否超時數組
/** * 驗證請求是否超時 * @param [array] $arr [包含時間戳的參數數組] * @return [json] [檢測結果] */ public function check_time($arr) { if (!isset($arr['timestamp']) || intval($arr['timestamp']) <= 1) { $this->return_msg(1,'Timestamp error'); } if (time() - intval($arr['timestamp']) > 300) { $this->return_msg(1,'Request timeout'); } }
驗證token安全
/** * 驗證token(防止篡改數據) * @param [array] $arr [所有請求參數] * @return [json] [token驗證結果] */ public function check_token($arr) { /*********** api傳過來的token ***********/ if (!isset($arr['token']) || empty($arr['token'])) { $this->return_msg(1,'Token can`t be empty'); } $app_token = $arr['token']; // api傳過來的token /*********** 服務器端生成token ***********/ unset($arr['token']); $service_token = ''; foreach ($arr as $key => $value) { $service_token .= md5($value); } $service_token = md5(config('app.login_begin'). $service_token .config('app.login_end')); // 服務器端即時生成的token /*********** 對比token,返回結果 ***********/ if ($app_token !== $service_token) { $this->return_msg(1,'Token is not correct'); } }
驗證參數服務器
/** * 驗證參數 參數過濾 * @param [array] $arr [除time和token外的全部參數] * @return [return] [合格的參數數組] */ public function check_params($arr) { /*********** 獲取參數的驗證規則 ***********/ $rule = $this->rules[$this->request->controller()][$this->request->action()]; /*********** 驗證參數並返回錯誤 ***********/ $this->validater = new Validate($rule); if (!$this->validater->check($arr)) { $this->return_msg(1,$this->validater->getError()); } /*********** 若是正常,經過驗證 ***********/ return $arr; }
能夠登錄後將token存儲起來,也能夠每次請求都驗證token.app