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 相关文章推荐
在IIS上安装PHP4.0正式版
Oct 09 PHP
php自动跳转中英文页面
Jul 29 PHP
MySql 按时间段查询数据方法(实例说明)
Nov 02 PHP
一个PHP并发访问实例代码
Sep 06 PHP
php获取通过http协议post提交过来xml数据及解析xml
Dec 16 PHP
PHP简单选择排序算法实例
Jan 26 PHP
php访问数组最后一个元素的函数end()用法
Mar 18 PHP
PHP利用imagick生成组合缩略图
Feb 19 PHP
PHP简单实现生成txt文件到指定目录的方法
Apr 25 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
Sep 16 PHP
Laravel学习基础之migrate的使用教程
Oct 11 PHP
详解PHP设计模式之依赖注入模式
May 25 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
开源SNS系统-ThinkSNS
2008/05/18 PHP
深入了解PHP类Class的概念
2012/06/14 PHP
windows下配置php5.5开发环境及开发扩展
2014/12/25 PHP
php实现RSA加密类实例
2015/03/26 PHP
dojo学习第二天 ajax异步请求之绑定列表
2011/08/29 Javascript
javascript五图轮播切换实用版
2012/08/17 Javascript
火狐textarea输入法的bug的触发及解决
2013/07/24 Javascript
js showModalDialog参数的使用详解
2014/01/07 Javascript
jQuery遍历Table应用示例
2014/04/09 Javascript
node.js中的socket.io入门实例
2014/04/26 Javascript
jQuery中ready事件用法实例
2015/01/19 Javascript
node.js从数据库获取数据
2016/05/08 Javascript
利用jsonp跨域调用百度js实现搜索框智能提示
2016/08/24 Javascript
微信小程序 定义全局数据、函数复用、模版等详细介绍
2016/10/27 Javascript
jquery.validate[.unobtrusive]和Bootstrap实现tooltip错误提示问题分析
2016/10/30 Javascript
jQuery动态生成Bootstrap表格
2016/11/01 Javascript
jQuery Form表单取值的方法
2017/01/11 Javascript
微信小程序学习之数据处理详解
2017/07/05 Javascript
ReactNative页面跳转Navigator实现的示例代码
2017/08/02 Javascript
解析Vue.js中的组件
2018/02/02 Javascript
在python中使用requests 模拟浏览器发送请求数据的方法
2018/12/26 Python
通过 Django Pagination 实现简单分页功能
2019/11/11 Python
Python 实现打印单词的菱形字符图案
2020/04/12 Python
python openpyxl模块的使用详解
2021/02/25 Python
俄罗斯购买剧院和演唱会门票网站:Parter.ru
2019/11/09 全球购物
2013年员工自我评价范文
2013/12/27 职场文书
部队领导证婚词
2014/01/12 职场文书
幼儿园三八妇女节活动方案
2014/03/11 职场文书
营销总监岗位职责
2014/09/16 职场文书
无刑事犯罪记录证明
2014/09/18 职场文书
2014购房个人委托书范本
2014/10/12 职场文书
2014社区健康教育工作总结
2014/12/16 职场文书
物流业务员岗位职责
2015/04/03 职场文书
2015年汽车销售经理工作总结
2015/04/27 职场文书
导游词之太原天龙山
2020/01/02 职场文书
纯CSS3实现div按照顺序出入效果
2021/07/15 HTML / CSS