当前位置: 首页 > 后端技术 > PHP

PHP、api接口请求token验证

时间:2023-03-29 18:19:04 PHP

添加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',),),);/***构造函数*初始化检测请求时间、签名等*/publicfunction_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']));}定义返回data/***api数据的方法return*@param[int]$code[resultcode200:正常/4**数据问题/5**服务器问题]*@param[string]$msg[接口返回的提示信息]*@param[array]$data[接口要返回的数据]*@return[string][最终json数据]*/publicfunctionreturn_msg($code,$msg='',$data=[]){$return_data['code']=$code;$return_data['msg']=$msg;$return_data['数据']=$数据;echojson_encode($return_data);die;}验证是否超时/***验证请求是否超时*@param[数组]$arr[包含时间戳的参数数组]*@return[json][测试结果]*/publicfunctioncheck_time($arr){if(!isset($arr['timestamp'])||intval($arr['timestamp'])<=1){$this->return_msg(1,'Timestamperror');}if(time()-intval($arr['timestamp'])>300){$this->return_msg(1,'请求超时');}}verificationtoken/***验证token(防止篡改数据)*@param[数组]$arr[所有请求参数]*@return[json][token验证结果]*/publicfunctioncheck_token($arr){/************api传递的token***********/if(!isset($arr['token'])||empty($arr['token'])){$this->return_msg(1,'Token不能为空');}$app_token=$arr['token'];//api传过来的token/************服务器生成的token*************/unset($arr['token']);$service_token='';Foreach($arras$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,'令牌不正确');}}验证参数/***验证参数参数过滤*@param[array]$arr[除time和token之外的所有参数]*@return[return][符合条件的参数数组]*/publicfunctioncheck_params($arr){/************获取参数的校验规则************/$rule=$this->rules[$this->request->controller()][$this->request->action()];/************验证参数并返回错误*********/$this->validater=newValidate($rule);如果(!$this->validater->check($arr)){$this->return_msg(1,$this->validater->getError());}/************如果正常,通过验证************/return$arr;}登录后保存token,即可每次请求时还要验证令牌。