7

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

先声明一些验证规则

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 数据返回
 * @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.


王不凡
52 声望0 粉丝

程序员最讨厌的四件事: