thinkphp5框架API token身份验证功能示例


Posted in PHP onMay 21, 2019

本文实例讲述了thinkphp5框架API token身份验证功能。分享给大家供大家参考,具体如下:

使用说明:登陆时生成token和刷新用的refresh_token,返回给客户端,客户端收到保存本地localStorage等,每次访问接口带上token,后端验证token存在并且一致后方可执行接下来的动作,假如不存在就返回token过期,客户端调用刷新接口传入token和refresh_token,服务器端进行验证,验证通过重新生成新的token保存数据库,返回给客户端客户端刷新本地token访问即可继续,当refresh_token验证失败就清除数据库token,过期时间等信息

简单的token生成函数(公共函数文件common)

function create_token($id,$out_time){
  return substr(md5($id.$out_time),5,26);
}

验证登陆方法(模型)

public function checkLogin($username,$passwd){
    $driver = self::field('driver_id,passwd')->where('zhanghao',$username)->whereOr('phone',$username)->find();
    if (empty($driver)){
      $this->error = '账号不存在';
      return false;
    }
    if ($driver['passwd'] != md5($passwd)){
      $this->error = "密码不正确";
      return false;
    }
    //$out_time = strtotime('+ 1 days');
    $out_time = strtotime('+ 1 minutes');
    $token = create_token($driver['driver_id'],$out_time);
    if(false===self::save(['token'=>$token,'time_out'=>$out_time],['driver_id'=>$driver['driver_id']])){
      $this->error = '登陆失败';
      return false;
    }
    $refresh_token_out_time = strtotime('+ 5 days');
    $refresh_token = create_token($driver['driver_id'],$refresh_token_out_time);
    Cache::set("token",$token,60);
    Cache::set("driver_id",$driver['driver_id'],$refresh_token_out_time);//设置ID的过期时间和更新token的token时间一样用于更新的时候获取用户信息
    Cache::set('refresh_token',$refresh_token,$refresh_token_out_time);
    return ['token'=>$token,'refresh_token'=>$refresh_token,'in_expire'=>$out_time];
}

token刷新方法(模型)

public function refreshToken($refresh_token,$token){
    if (!isset(Cache::get('refresh_token')) or Cache::get('refresh_token')!=$refresh_token){
      $this->error = '刷新token失败';
      return false;
    }
    $cache_driver_id = Cache::get('driver_id');
    $driver = self::field('driver_id,passwd')->where('driver_id',$cache_driver_id)->where('token',$token)->find();
    if (empty($driver)){
      $this->error = '参数错误';
      return false;
    }
    $out_time = strtotime('+ 1 days');//新的过期时间
    $token = create_token($driver['driver_id'],$out_time);//更新token
    if(false===self::save(['token'=>$token,'time_out'=>$out_time],['driver_id'=>$driver['driver_id']])){
      Cache::clear($token);
      $this->error = '刷新失败';
      return false;
    }
    Cache::set("token",$token,864000);
    return ['token'=>$token,'in_expire'=>$out_time];
}

退出方法(模型)

public function logout($token,$refresh_token=''){
    $driver = self::field('driver_id,passwd')->where('token',$token)->find();
    self::save(['token'=>'','time_out'=>''],['token'=>$token]);
    Cache::clear('token');
    Cache::clear('refresh_token');
}

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

PHP 相关文章推荐
一个PHP+MSSQL分页的例子
Oct 09 PHP
一个php Mysql类 可以参考学习熟悉下
Jun 21 PHP
PHP中基本符号及使用方法
Mar 23 PHP
PHP输出缓存ob系列函数详解
Mar 11 PHP
PHP中4个加速、缓存扩展的区别和选用建议
Mar 12 PHP
PHP对象相关知识总结
Apr 09 PHP
ThinkPHP实现图片上传操作的方法详解
May 08 PHP
php中访问修饰符的知识点总结
Jan 27 PHP
用PHP做了一个领取优惠券活动的示例代码
Jul 05 PHP
php解决约瑟夫环算法实例分析
Sep 30 PHP
php文件上传原理与实现方法详解
Dec 20 PHP
Linux系统下安装PHP7.3版本
Jun 26 PHP
php curl操作API接口类完整示例
May 21 #PHP
PHP钩子实现方法解析
May 21 #PHP
php面向对象程序设计中self与static的区别分析
May 21 #PHP
PHP经典设计模式之依赖注入定义与用法详解
May 21 #PHP
PHP常见过waf webshell以及最简单的检测方法
May 21 #PHP
PHP __call()方法实现委托示例
May 20 #PHP
PHP消息队列实现及应用详解【队列处理订单系统和配送系统】
May 20 #PHP
You might like
探讨PHP中OO之静态关键字以及类常量的详解
2013/06/07 PHP
php编写批量生成不重复的卡号密码代码
2015/05/14 PHP
php进程间通讯实例分析
2016/07/11 PHP
php中简单的对称加密算法实现
2017/01/05 PHP
Yii2框架视图(View)操作及Layout的使用方法分析
2019/05/27 PHP
PHP中有关长整数的一些操作教程
2019/09/11 PHP
javascript 写类方式之五
2009/07/05 Javascript
深入理解JavaScript系列(43):设计模式之状态模式详解
2015/03/04 Javascript
JavaScript实现输入框与清空按钮联动效果
2016/09/09 Javascript
Bootstrap 填充Json数据的实例代码
2017/01/11 Javascript
js事件冒泡与事件捕获详解
2017/02/20 Javascript
Javascript 实现匿名递归的实例代码
2017/05/25 Javascript
css和js实现弹出登录居中界面完整代码
2017/11/26 Javascript
node实现登录图片验证码的示例代码
2018/04/20 Javascript
Vue.js 十五分钟入门图文教程
2018/09/12 Javascript
使用JavaScrip模拟实现仿京东搜索框功能
2019/10/16 Javascript
解决vue.js提交数组时出现数组下标的问题
2019/11/05 Javascript
vue 单页应用和多页应用的优劣
2020/10/22 Javascript
python通过smpt发送邮件的方法
2015/04/30 Python
Python计算三维矢量幅度的方法
2015/06/15 Python
Python代码实现http/https代理服务器的脚本
2019/08/12 Python
python小程序基于Jupyter实现天气查询的方法
2020/03/27 Python
如何在python中处理配置文件代码实例
2020/09/27 Python
Python爬虫定时计划任务的几种常见方法(推荐)
2021/01/15 Python
HTML5的文档结构和新增标签完全解析
2017/04/21 HTML / CSS
Lyle & Scott苏格兰金鹰官网:英国皇室御用品牌
2018/05/09 全球购物
Carolina工作鞋官网:Carolina Footwear
2019/03/14 全球购物
施华洛世奇西班牙官网:SWAROVSKI西班牙
2019/06/06 全球购物
澳大利亚家具商店:Freedom
2020/12/17 全球购物
如何启动时不需输入用户名与密码
2014/05/09 面试题
阿尔卡特(中国)的面试题目
2014/08/20 面试题
学年自我鉴定范文
2013/10/01 职场文书
故宫的导游词
2015/01/31 职场文书
八年级作文之感悟亲情
2019/11/20 职场文书
PHP实现rar解压读取扩展包小结
2021/06/03 PHP
VUE之图片Base64编码使用ElementUI组件上传
2022/04/09 Vue.js