PHP, api接口請求token驗證

加token的目的,不言而喻,爲了api接口的安全性。等等 ~~~

先聲明一些驗證規則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

相關文章
相關標籤/搜索