资讯专栏INFORMATION COLUMN

PHP, api接口请求token验证

supernavy / 1288人阅读

加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.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/28744.html

相关文章

  • 【日常填坑】之ajax请求laravel的api接口

    摘要:合适和够用是最完美的追求。比如从页面去请求的资源。它允许浏览器向跨源服务器,发出请求,从而克服了只能同源使用的限制。定义在中的路由都是无状态的,并且会应用中间件组。 关于作者 程序开发人员,不拘泥于语言与技术,目前主要从事PHP和前端开发,使用Laravel和VueJs,App端使用Apicloud混合式开发。合适和够用是最完美的追求。 个人网站:http://www.linganm...

    Arno 评论0 收藏0
  • 【日常填坑】之ajax请求laravel的api接口

    摘要:合适和够用是最完美的追求。比如从页面去请求的资源。它允许浏览器向跨源服务器,发出请求,从而克服了只能同源使用的限制。定义在中的路由都是无状态的,并且会应用中间件组。 关于作者 程序开发人员,不拘泥于语言与技术,目前主要从事PHP和前端开发,使用Laravel和VueJs,App端使用Apicloud混合式开发。合适和够用是最完美的追求。 个人网站:http://www.linganm...

    neu 评论0 收藏0
  • 【日常填坑】之ajax请求laravel的api接口

    摘要:合适和够用是最完美的追求。比如从页面去请求的资源。它允许浏览器向跨源服务器,发出请求,从而克服了只能同源使用的限制。定义在中的路由都是无状态的,并且会应用中间件组。 关于作者 程序开发人员,不拘泥于语言与技术,目前主要从事PHP和前端开发,使用Laravel和VueJs,App端使用Apicloud混合式开发。合适和够用是最完美的追求。 个人网站:http://www.linganm...

    fuyi501 评论0 收藏0
  • APIapi 下 session 的 Yes or No?

    摘要:对了,在这之前,首先要祝大家端午节快乐嘎嘎正文切入正题。其实在接入之前,我就有点范嘀咕,客户端不会拿不到吧果然怕什么来什么,安卓那边告诉我错误,取不到值。和安卓那边沟通,他们表示框架中可以模拟浏览器行为,实现的自动发送。 写在前面 时间:2017-05-29 7:30 距离上篇文章发布已经一个多月了,本来自己的计划是一周一记,怎么就变成月记了呢?最近工作的事情忙的焦头烂额,当然也不能...

    Y3G 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<