PHP, api接口请求token验证

全屏阅读
  • 基本信息
  • 作者:
  • 作者已发布:917篇文章
  • 发布时间:2020年01月07日 21:18:46
  • 所属分类:PHP+MySql
  • 阅读次数:3632次阅读
  • 标签:

加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%
» 郑重声明:本文由mpxq168发布,所有内容仅代表个人观点。版权归恒富网mpxq168共有,欢迎转载, 但未经作者同意必须保留此段声明,并给出文章连接,否则保留追究法律责任的权利! 如果本文侵犯了您的权益,请留言。

目前有 0 条留言 其中:访客:0 条, 博主:0 条

给我留言

您必须 [ 登录 ] 才能发表留言!