php api接口验证,PHP, api接口请求token验证

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

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)

100%订阅

回复

踩一下

(0)

100%

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值