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 日期出现中文字符的解决方法
Mar 10 PHP
php MYSQL 数据备份类
Jun 19 PHP
php设计模式 Visitor 访问者模式
Jun 28 PHP
apache mysql php 源码编译使用方法
May 03 PHP
php中通过curl smtp发送邮件
Jun 05 PHP
解析dedecms空间迁移步骤详解
May 15 PHP
php的curl封装类用法实例
Nov 07 PHP
PHP常见的6个错误提示及解决方法
Jul 07 PHP
php异步:在php中使用fsockopen curl实现类似异步处理的功能方法
Dec 10 PHP
php curl获取到json对象并转成数组array的方法
May 31 PHP
laravel框架学习笔记之组件化开发实现方法
Feb 01 PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
Feb 28 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
Base64在线编码解码实现代码 演示与下载
2011/01/08 PHP
PHP中文乱码解决方案
2015/03/05 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
php7 错误处理机制修改实例分析
2020/05/25 PHP
js 编写规范
2010/03/03 Javascript
JavaScript中的作用域链和闭包
2012/06/30 Javascript
JS实现图片横向滚动效果示例代码
2013/09/04 Javascript
整理的比较全的event对像在ie与firefox浏览器中的区别
2013/11/25 Javascript
JavaScript仿支付宝密码输入框
2015/12/29 Javascript
基于Echarts 3.19 制作常用的图形(非静态)
2016/05/19 Javascript
纯JS打造网页中checkbox和radio的美化效果
2016/10/13 Javascript
AngularJS实现在ng-Options加上index的解决方法
2016/11/03 Javascript
Vue.js常用指令汇总(v-if、v-for等)
2016/11/03 Javascript
WEB开发之注册页面验证码倒计时代码的实现
2016/12/15 Javascript
Vue.js教程之axios与网络传输的学习实践
2017/04/29 Javascript
angular bootstrap timepicker TypeError提示怎么办
2017/06/13 Javascript
微信小程序 rich-text的使用方法
2017/08/04 Javascript
浅谈javascript错误处理
2019/08/11 Javascript
Elementui表格组件+sortablejs实现行拖拽排序的示例代码
2019/08/28 Javascript
layui数据表格 table.render 报错的解决方法
2019/09/29 Javascript
js+css3实现简单时钟特效
2020/09/13 Javascript
Django如何自定义分页
2018/09/25 Python
pygame游戏之旅 python和pygame安装教程
2018/11/20 Python
Python图像处理之图像的读取、显示与保存操作【测试可用】
2019/01/04 Python
Python文件读写w+和r+区别解析
2020/03/26 Python
Python检测端口IP字符串是否合法
2020/06/05 Python
CSS3毛玻璃效果(blur)有白边问题的解决方法
2016/11/15 HTML / CSS
印度最大的旅游网站:MakeMyTrip
2016/10/05 全球购物
遗体告别仪式答谢词
2014/01/23 职场文书
优秀的2014年两会精神解读
2014/03/17 职场文书
2014年信息技术工作总结
2014/12/16 职场文书
团队执行力培训心得体会
2015/08/15 职场文书
人事任命书范本
2015/09/21 职场文书
英语教学课后反思
2016/02/15 职场文书
担保书怎么写 ?
2019/04/22 职场文书
win10截图快捷键win+shift+s没有反应无法截图怎么解决?
2022/08/14 数码科技