加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.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。