记住用户名密码
1.前端传账号密码给后端
2.后端将账号密码作处理加密生成token,并返回给前端
3.前端将token存入缓存,在每次请求时,在header或url中将token传给后端
4.将前端传来的token与数据库账号密码生成的token作比对,相等则成功。
先声明一些验证规则
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.
目前有 0 条留言 其中:访客:0 条, 博主:0 条